2013-02-21 17 views
2

根據我的理解,NSOperation的長期運行任務應該在其main函數中實現,在NSOperation被添加到NSOperationQueue之後,它會被觸發。NSOperation有一個以上的長時間任務

這對我來說很好,直到現在,我的NSOperation有一個以上的主要任務。

第一項任務是解析一個文檔(在打開文檔時應該只應用一次)。

第二項任務是將NSData附加到文檔(對於打開的文檔可以多次調用)。

我能想到的唯一的辦法就是這兩個任務移動到main功能,並在運行時執行該任務的決定:

- (void)main 
{ 
    @autoreleasepool 
    { 
     if(firstTaskTsDone) 
     { 
      [self doSecondTask]; 
     } 
     else 
     {  
      [self doFirstTask]; 
      firstTaskTsDone = YES; 
     } 
    } 
} 

但我想,必須有一個更好的方式來實現這一目標?

ALSO:如何使用併發操作實現相同的結果?

回答

1

您應該爲第二項任務創建第二個NSOperation。您可以使用:

[secondOperation addDependency:firstOperation]; 

使第二個操作依賴於第一個操作完成而開始。然後,您可以將這兩個操作添加到NSOperationQueue。在第二個操作中,您可以使用其dependencies屬性訪問第一個操作並提取第二個操作可能需要的任何數據以完成其任務。

另一種方法可以是將NSOperationQueue配置是一個串行隊列:

[operationQueue setMaxConcurrentOperationCount:1]; 

在這種情況下,你不會需要設置的依賴關係,並在其中添加了第一和第二NSOperation將決定順序它們的運行順序。

如何使用併發操作實現相同的結果?

NSOperationQueue and NSOperations主要目的是使併發的非並行任務。如果你的代碼還沒有涉及某種併發任務,那麼沒有理由使用併發的NSOperation

併發任務的一個常見示例是NSURLConnection請求。這通常包含在併發NSOperation中,因此它可以作爲更長進程的一部分添加到NSOperationQueue,其中其他NSOperations將被添加到隊列以處理請求的結果。

main方法返回時,正常NSOperation完成。如果您在main中異步啓動了NSURLConnection,則在連接完成之前您將立即返回。通過將其配置爲併發操作,當連接實際完成時,您負責向NSOperationQueue發信號通知。

相關問題