2011-07-22 124 views
2

我有一個NSOperation運行在NSOperationQueue。 NSOperation下載一些數據並將其解析爲NSDictionary。我如何知道NSOperation何時完成並獲取該字典? 謝謝。NSOperation finished

回答

0

通常要做的事情是讓NSOperation調用任何對象需要知道操作完成的方法。或者您可以使用NSNotificationCenter來允許各種對象以更分散的方式偵聽更新。或者您可以使用KVO收聽NSOperation的isFinished屬性。

0

最好的方法是用一個委託來初始化你的NSOperation。當NSOperation完成他的工作後,他將使用委託方法之一(通過協議聲明)調用委託。

+0

感謝您的回覆。我認爲這不會起作用,因爲手術是在另一個線程中,但讓我試試這個。 – user635064

+0

沒有問題,因爲你在不同的線程。您的消息將會發送給您的代表。 –

5

您還可以使用NSOperation- (void)setCompletionBlock:

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"Doing something..."); 
}]; 

[operation setCompletionBlock:^{ 
    NSLog(@"Doing something once the operation has finished..."); 
}]; 

[queue addOperation:operation]; 

更多的細節here

+0

重要的是要注意,沒有保證(1)何時和(2)在哪個線程上執行完成塊。文檔更詳細地討論了這些問題。當然,完成程序塊在操作完成後執行。不確定的是它執行的確切時刻(順序)。 –

1

如果需要知道,當操作完成本身就是一個的NSOperation的代碼塊,那麼你可以優雅地建立它們之間的依賴關係處理這個問題:

[laterOp addDependency:downloadAndParseOp]; 

的laterOp後,才執行downloadAndPareOp已完成。

事實上,我會鼓勵你編寫你的代碼,以便這種方法是可能的。 NSOperations和NSOperationQueue最大的優點之一是它可以輕鬆地協調代碼執行。

+0

下載最大的問題是如果你使用'NSURLSession',那麼你的操作將是異步的。即操作將完成,然後稍後,下載將完成。解決方法:使NSURLSession同步,或者NSOperation子類只在下載完成後設置「isFinished」。 –