我有一堂課。在這個類的內部,我將一個NSOperation傳遞給我的全局變量中的NSOperationQueue。NSOperation和NSOperationQueue回調
現在我的NSOperation完成了。我只是想知道它已經在我的課程中完成了,並且讓操作將數據傳遞給了這個類。這通常如何完成?
我有一堂課。在這個類的內部,我將一個NSOperation傳遞給我的全局變量中的NSOperationQueue。NSOperation和NSOperationQueue回調
現在我的NSOperation完成了。我只是想知道它已經在我的課程中完成了,並且讓操作將數據傳遞給了這個類。這通常如何完成?
我使用委託模式 - 這是蘋果開發者大會上各位推薦給我的方法。
腳手架:
MyOperationDelegate
與setResult:(MyResultObject *) result
方法。@property id<MyOperationDelegate> delegate;
添加到您創建的NSOperation子類。工作:
[myOperation setDelegate: self];
[delegate setResult: myResultObject];
將結果傳遞。添加一個觀察者,你的類偵聽更改的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 Guide和Concurrency Programming Guide更多信息。
另外,請注意觀察者將在與Operation相同的線程上接收,因此如果您想要處理UI,您可能需要在主線程上運行代碼。
另一種替代方法...如果您在操作完成時需要做一些工作,可以將該工作放在一個塊中並使用依賴性。這非常簡單,尤其是使用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");
}];
我相信這是最乾淨的方法,因爲您可以很好地分離操作,並且還可以重複使用它們。 – 2013-05-22 12:06:50
它會和操作一樣運行在同一個線程上嗎? – Mel 2009-12-30 18:02:28
是的,除非你使用performSelectorOnMainThread來指定。 – 2009-12-30 18:40:45