2012-07-10 49 views
3

我有一堆NSOperations添加到NSOperationQueue。操作队列的maxConcurrentOperationCount设置为1,以便NSOperations一个接一个地运行。NSOperations及其completionBlocks是否同时运行?

如今,在NSOperation我想通过在NSOperationQueue调用cancelAllOperations取消所有未决NSOperationscompletionBlock

这样做是否安全?我是否可以确定只有在前一个操作的completionBlock已完全执行后才会调用下一个操作的start-方法?或者执行前一个操作的completionBlock和当前操作的任务是否同时运行?

我之所以问:我使用AFNetworking来执行一批AFHTTPRequestOperations,并希望只有当该批次的所有先前请求都成功时才执行一个请求。

回答

4

我的调查结果似乎不再是真实的。我已经在iOS 8和iOS 9上重新运行测试,并且操作的完成块始终与下一个操作同时运行。目前,我没有看到让操作等待上一个完成块完成的方法。


我刚刚在示例项目中尝试过这种情况。下面是结果:

如果NSOperationQueuemaxConcurrentOperationCount被设置为1,一个NSOperationcompletionBlock和在队列中运行的下一个NSOperation同时。

但是,如果每个NSOperation通过调用addDependency:链接到其以前的操作,操作的执行等待,直到前面的操作的completionBlock已完成。

所以,如果要取消当前操作的completionBlock下一个操作,并确保它被取消开始之前,你必须设置NSOperations之间的依赖关系,通过调用addDependency:

+0

大分析!刚刚经历过同样的事情。 – Klaas 2015-07-22 10:39:59

+0

这似乎并不真实,至少不适用于iOS 9.我有一个完成块,我可能要取消依赖操作,但通常在完成块运行之前已经开始执行。 – Accatyyc 2016-02-15 16:31:13

+0

你是对的,我重新运行了我的实验,现在完成块和下一个操作总是并行运行。 – Tom 2016-07-01 14:05:57