在NSOperation子类中侦听NSNotifications?

时间:2015-03-05 11:21:22

标签: ios multithreading nsoperation nsnotification

我正在编写一个应用程序,我在后台运行了长时间运行的服务器同步任务,我想为此使用NSOperation和NSOperationQueue。我倾向于这种方式,因为我需要确保一次只运行一个同步操作。

我的问题出现了,因为我的架构是围绕NSNotifications构建的;我的同步逻辑基于这些通知继续进行。从我所看到的,NSOperation逻辑需要打包到main方法中。所以我想知道的是,当收到某个通知时,是否有任何方式可以完成NSOperation。我怀疑情况并非如此,因为我没有偶然发现任何这种用法的例子,但我想我会问这里的大师。当主要方法结束时,NSOperation是否刚刚完成?

2 个答案:

答案 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适用于长时间运行的后台/异步任务。

NSOperation Documentation

参见:Subclassing Notes&操作依赖部分

编辑:(添加更多说明)

主要方法完成后,基本上并发操作无法完成。实际上,并发操作意味着控件将在实际操作完成之前返回到调用代码。在并发操作的start方法中执行的典型任务是:将操作标记为执行,启动异步工作(例如NSURLConnection异步调用)或生成将执行大量任务的新线程。并返回。

当异步任务完成时,将操作标记为已完成。