2011-05-23 151 views
0

我有一個視圖控制器是UIViewController的子類,它具有表視圖,表視圖中的每一行都鏈接到不同的xml url。 我做了一個解析器類是子類的NSOperation和實現的方法來解析每行作爲選擇的XML文件,NSOperationQueue避免將視圖控制器推入導航控制器堆棧?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    [self performSelectorOnMainThread:@selector(pushView) withObject:nil waitUntilDone:NO]; 
    [self performSelectorInBackground:@selector(parseOperation:) withObject:indexPath]; 
} 

- (void)pushView { 
    detailView = [[viewDetailsController alloc] initWithNibName:@"viewDetailsController" bundle:nil]; 
    [self.navigationController pushViewController:detailView animated:YES]; 
} 

- (void)parseOperation:(NSIndexPath *)indexPath { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    self.queue = [[NSOperationQueue alloc] init]; 
    parserClass *parser = [[parserClass alloc] initWithParseUrl:[[self.arrayOfUrls objectAtIndex:indexPath.row]delegate:self]; 
    [queue addOperation:parser]; 
    [parser release]; 
    [pool release]; 
} 

分析器的偉大工程,但在其自定義的委託方法我稱之爲推視圖控制器在導航控制器堆棧頂部,視圖控制器將正確初始化,但新視圖控制器不會被推入屏幕。

我已經編輯了使用主線程和後臺線程的問題,而後臺線程正常工作以解析主線程只是初始化並且不推送視圖控制器。 問題是什麼?

回答

2

您需要在主線程上推視圖控制器。使用performSelectorOnMainThread:withObject:waitUntilDone:來調用主線程上的方法。

如果您有可能會推送多個視圖控制器,如果視圖控制器被壓入堆棧而另一個被動畫時,您的應用程序將崩潰。在這種情況下,您應該指定animated:NO或收集查看NSArray中的控制器並使用setViewControllers:animated:將它們添加到堆棧。


在回答您的問題更新:你不應該需要通過performSelectorInBackground:withObject:調用parseOperation:,因爲它在一個單獨的線程創建反正NSOperationQueue將執行的NSOperation。我建議增加一個delegate屬性與您的NSOperation子類,並按照這個模式:

MyViewController.m

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyParseOperation *parseOp = ... 
    parseOp.delegate = self; 
    [myOperationQueue addOperation:parseOp]; 
} 

// Called by MyParseOperation 
- (void)operationCompletedWithXML:(XML *)parsedXML 
{ 
    // Use parsedXML to create and configure a view controller 
    MyCustomViewController *vc = ... 

    // Animation is OK since only one view controller will be created 
    [self.navigationController pushViewController:vc animated:YES]; 
} 

MyParseOperation.m

// Call this method once the XML has been parsed 
- (void)finishUp 
{ 
    // Invoke delegate method on the main thread 
    [self.delegate performSelectorOnMainThread:@selector(operationCompletedWithXML:) withObject:self.parsedXML waitUntilDone:YES]; 

    // Perform additional cleanup as necessary 
} 
+0

我已經編輯我的代碼,如上,但仍然沒有工作。我不知道這個代碼有什麼問題? – Sandeep 2011-05-23 06:24:51

+0

@瘋狂-36:看看我更新的答案是否有幫助。 – titaniumdecoy 2011-05-23 18:08:08

+1

是的,這幫了我。我認爲這在解析完成後立即推送視圖控制器。但是如果我想在選中某行時立即推送視圖控制器,該怎麼辦?我的意思是如果我想推視圖控制器和同時解析XML ... – Sandeep 2011-05-25 07:59:47

相關問題