当前位置:  开发笔记 > 编程语言 > 正文

NSOperation和NSOperationQueue回调

如何解决《NSOperation和NSOperationQueue回调》经验,为你挑选了3个好方法。

我上课了.在这个课程中,我将NSOperation传递给NSOperationQueue,它存在于我的全局变量中.

现在我的NSOperation已经完成了.我只是想知道它已经在我的类中完成并且让操作将数据传递给该类.这通常是怎么做的?



1> Kris Jenkins..:

我使用委托模式 - 这是Apple开发者大会上向我推荐的方法.

脚手架:

    MyOperationDelegate使用setResult:(MyResultObject *) result方法设置协议.

    有谁需要结果实现该协议.

    添加@property id delegate;到您创建的NSOperation子类.

工作:

    在创建操作时,但在排队之前,请告诉它应该接收结果的人.通常,这是创建操作的对象:[myOperation setDelegate: self];

    在操作的主函数结束时,调用[delegate setResult: myResultObject];以传递结果.



2> Robert..:

另一种选择......如果你需要在操作完成时做一些工作,你可以将这个工作包装在一个块中并使用依赖.这非常简单,特别是对于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");
}];



3> Jablair..:

向您的类添加一个观察者,该类侦听NSOperation子类的isFinished值的更改

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

然后实现以下方法,让它查找您注册为监听器的上下文.您可以通过访问器方法/属性使您想要从NSOperation子类检索的数据可用.

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

有关详细信息,请查看" KVO编程指南"和" 并发编程指南".

另请注意,观察者将在与操作相同的线程上接收,因此如果要处理UI,可能需要在主线程上运行代码.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有