我正在编写一个应用程序,我在后台运行了长时间运行的服务器同步任务,我想为此使用NSOperation和NSOperationQueue。我倾向于这种方式,因为我需要确保一次只运行一个同步操作。
我的问题出现了,因为我的架构是围绕NSNotifications构建的;我的同步逻辑基于这些通知继续进行。从我所看到的,NSOperation逻辑需要打包到main方法中。所以我想知道的是,当收到某个通知时,是否有任何方式可以完成NSOperation。我怀疑情况并非如此,因为我没有偶然发现任何这种用法的例子,但我想我会问这里的大师。当主要方法结束时,NSOperation是否刚刚完成?
答案 0 :(得分:2)
没有理由NSOperation
无法在主线程上侦听通知,但是完成逻辑必须是线程安全的,或者操作必须跟踪其当前线程。
我会推荐一种不同的方法。子类NSOperation
支持像-finishWithNotification:
这样的方法拥有一个侦听通知的队列管理器。它可以遍历其操作,完成响应-finishWithNotification:
的任何操作。
- (void)handleFinishNotification:(NSNotification *)notification
{
for (NSOperation *operation in self.notificationQueue) {
if ([operation isKindOfClass:[MYOperation class]]) {
dispatch_async(self.notificationQueue.underlyingQueue), ^{
MYOperation *myOperation = (MYOperation *)operation;
[myOperation finishWithNotification:notification];
});
}
}
}
答案 1 :(得分:1)
如果我理解正确并发NSOperation
就是您所需要的。
Concurrent NSOperation适用于长时间运行的后台/异步任务。
参见:Subclassing Notes&操作依赖部分
编辑:(添加更多说明)
主要方法完成后,基本上并发操作无法完成。实际上,并发操作意味着控件将在实际操作完成之前返回到调用代码。在并发操作的start方法中执行的典型任务是:将操作标记为执行,启动异步工作(例如NSURLConnection异步调用)或生成将执行大量任务的新线程。并返回。
当异步任务完成时,将操作标记为已完成。