我正在编写一个应用程序,其中有一个在后台运行的长时间运行的服务器同步任务,我想使用NSOperation和NSOperationQueue来完成这个任务。我倾向于这种方式,因为我需要确保一次只有一个同步操作在运行。
我的问题出现了,因为我的架构是围绕NSNotifications构建的;我的同步逻辑是基于这些通知进行的。在我看来,NSOperation逻辑需要打包到main方法中。所以我想知道的是,当收到特定的通知时,是否有任何方法可以让NSOperation完成。我怀疑情况并非如此,因为我还没有偶然发现任何这种用法的例子,但我想我应该在这里请教一下上师。当到达main方法的末尾时,NSOperation是否刚刚结束?
发布于 2015-03-05 20:01:26
NSOperation没有理由不监听主线程上的通知,但要么finish逻辑必须是线程安全的,要么操作必须跟踪其当前线程。
我会推荐一种不同的方法。支持像-finishWithNotification:这样的方法的子类NSOperation有一个监听通知的队列管理器。它可以遍历其操作,完成响应-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];
});
}
}
}发布于 2015-03-05 19:30:26
如果我没理解错的话,并发NSOperation就是您所需要的。
并发NSOperation适用于长时间运行的后台/异步任务。
请参阅:子分类附注和操作相关性部分
编辑:(添加更多说明)
基本上,并发操作不会在main方法结束时结束。实际上,并发操作意味着在实际操作完成之前,控件将返回到调用代码。在并发操作的start方法中完成的典型任务是:将操作标记为正在执行,启动异步工作(例如NSURLConnection异步调用)或生成一个新线程来执行大部分任务。然后再回来。
异步任务完成后,将该操作标记为已完成。
https://stackoverflow.com/questions/28876666
复制相似问题