我有一堂课。在这个类的内部,我将一个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