Mel*_*Mel 8 iphone cocoa cocoa-touch objective-c
我上课了.在这个课程中,我将NSOperation传递给NSOperationQueue,它存在于我的全局变量中.
现在我的NSOperation已经完成了.我只是想知道它已经在我的类中完成并且让操作将数据传递给该类.这通常是怎么做的?
Kri*_*ins 23
我使用委托模式 - 这是Apple开发者大会上向我推荐的方法.
脚手架:
MyOperationDelegate
使用setResult:(MyResultObject *) result
方法设置协议.@property id<MyOperationDelegate> delegate;
到您创建的NSOperation子类.工作:
[myOperation setDelegate: self];
[delegate setResult: myResultObject];
以传递结果.Rob*_*ert 16
另一种选择......如果你需要在操作完成时做一些工作,你可以将这个工作包装在一个块中并使用依赖.这非常简单,特别是对于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];
Run Code Online (Sandbox Code Playgroud)
你也可以使用 setCompletionBlock
[myOp setCompletionBlock:^{
NSLog(@"MyOp completed");
}];
Run Code Online (Sandbox Code Playgroud)
Jab*_*air 15
向您的类添加一个观察者,该类侦听NSOperation子类的isFinished值的更改
[operation addObserver:self
forKeyPath:@"isFinished"
options:NSKeyValueObservingOptionNew
context:SOME_CONTEXT];
Run Code Online (Sandbox Code Playgroud)
然后实现以下方法,让它查找您注册为监听器的上下文.您可以通过访问器方法/属性使您想要从NSOperation子类检索的数据可用.
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请查看" KVO编程指南"和" 并发编程指南".
另请注意,观察者将在与操作相同的线程上接收,因此如果要处理UI,可能需要在主线程上运行代码.
归档时间: |
|
查看次数: |
9532 次 |
最近记录: |