0

我意識到這是其他人以前遇到的問題,但我似乎無法找到一個好的解決方案。我的問題是我想循環存儲在NSOperationQueue中的一些操作,並且當所有操作完成後,我想發佈通知。通知開始一個依賴所有操作完成的最終進程。但是,我的通知在操作完成前多次發送。這是我的方法:NSOperationqueue和postnotification完成時

self.queueFinished=FALSE; 
[self createFileobjectsForDirectories:self.mymode]; 

這導致操作(self.arrayOfOperations)的陣列,其還用於:

[self.myFileobjectsQueue addOperations:self.arrayOfOperations waitUntilFinished:NO]; 

NSInvocationOperation *completionOperation = [[NSInvocationOperation alloc] initWithTarget:self 
                        selector:@selector(runLastOperation:) 
                        object:start]; 
for (NSOperation *myOp in self.myFileobjectsQueue.operations){ 
    [completionOperation addDependency:myOp]; 
} 
[completionOperation setQueuePriority:NSOperationQueuePriorityVeryLow]; 
[self.myFileobjectsQueue addOperation:completionOperation]; 


-(void) runLastOperation:(NSDate*) start { 
    [[NSNotificationCenter defaultCenter] postNotificationName:kCompareFinished object:nil userInfo:nil]; 
    self.queueFinished=TRUE; 
} 

我曾嘗試時,我的隊列完成幾種方法來觀察所建議的elsewhere,沒有成功。這幾乎就像隊列爲空時,但在操作完成其任務之前調用通知。但根據Apple文檔,在isFinished標誌爲TRUE之前,操作不會從隊列中移除。我正在使用NSOperation的子類中的常規主函數運行併發操作。也許我在這裏誤解了一些東西,但是如何確保隊列不是空的,還要確保操作已經完成,我們將不勝感激。

乾杯,特龍

回答

0

它似乎並不像你需要的通知(至少不觸發最終處理)。相反,創建一個新操作,使其依賴於爲處理添加的所有其他操作,然後將其添加到隊列中。然後只有在所有其他操作完成後纔會運行。


您對isFinished確定操作何時完成是正確的。需要考慮的一件事是任何添加到操作的completionBlock都在操作完成後運行(不只是在完成之前)。

+0

「使其依賴於所有其他操作」 - 這不是OP已經在做什麼? –

+0

這正是我正在做的。我最後一次NSInvocationOperation取決於所有其他操作。最後的操作應該調用runLastOperation併發出通知。通知在12個操作隊列中關閉4-5次,我不明白爲什麼。 –

+0

那麼什麼時候操作定義爲完成(添加日誌記錄),同時運行多少個(添加日誌記錄),將斷點添加到通知文章中。這些都告訴你操作的順序是什麼? – Wain

相關問題