2009-12-30 75 views
7

我有一堂課。在這個類的內部,我將一個NSOperation傳遞給我的全局變量中的NSOperationQueue。NSOperation和NSOperationQueue回調

現在我的NSOperation完成了。我只是想知道它已經在我的課程中完成了,並且讓操作將數據傳遞給了這個類。這通常如何完成?

回答

21

我使用委託模式 - 這是蘋果開發者大會上各位推薦給我的方法。

腳手架:

  1. 設置一個協議MyOperationDelegatesetResult:(MyResultObject *) result方法。
  2. 有誰需要結果實現該協議。
  3. @property id<MyOperationDelegate> delegate;添加到您創建的NSOperation子類。

工作:

  1. 當你創建你的操作,但你排隊之前,告訴它誰應該得到的結果。通常,這是創建操作的對象:[myOperation setDelegate: self];
  2. 在操作的主函數結束時,請致電[delegate setResult: myResultObject];將結果傳遞。
+0

它會和操作一樣運行在同一個線程上嗎? – Mel 2009-12-30 18:02:28

+1

是的,除非你使用performSelectorOnMainThread來指定。 – 2009-12-30 18:40:45

14

添加一個觀察者,你的類偵聽更改的NSOperation子類

[operation addObserver:self 
      forKeyPath:@"isFinished" 
       options:NSKeyValueObservingOptionNew 
       context:SOME_CONTEXT]; 

然後實現以下方法的isFinished價值,有它尋找上下文您註冊爲監聽器。您可以通過訪問方法/屬性使您想要從NSOperation子類獲取的數據可用。

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 

檢查甌KVO Programming GuideConcurrency Programming Guide更多信息。

另外,請注意觀察者將在與Operation相同的線程上接收,因此如果您想要處理UI,您可能需要在主線程上運行代碼。

+1

我發現這是有問題的,因爲線程問題。有時觀察者不會被調用。我以這種方式得到了不穩定的行爲... – akw 2012-12-30 22:57:10

+0

您是否嘗試強制通知從主線程觸發? – Rambatino 2014-12-04 05:02:53

14

另一種替代方法...如果您在操作完成時需要做一些工作,可以將該工作放在一個塊中並使用依賴性。這非常簡單,尤其是使用NSBlockOperation。你

NSOperationQueue* myQueue = [[NSOperationQueue alloc] init]; 

NSBlockOperation* myOp = [NSBlockOperation blockOperationWithBlock:^{ 
    // Do work 
}]; 

NSBlockOperation* myOp2 = [NSBlockOperation blockOperationWithBlock:^{ 
    // Do work 
}]; 

// My Op2 will only start when myOp is complete 
[myOp2 addDependency:myOp]; 

[myQueue addOperation:myOp]; 
[myQueue addOperation:myOp2]; 

也可以使用setCompletionBlock

[myOp setCompletionBlock:^{ 
    NSLog(@"MyOp completed"); 
}]; 
+0

我相信這是最乾淨的方法,因爲您可以很好地分離操作,並且還可以重複使用它們。 – 2013-05-22 12:06:50

相關問題