1

我们在我们的应用程序中使用 AFNetworking ( https://github.com/AFNetworking/AFNetworking ) 和 NSOperationStack ( https://github.com/nicklockwood/NSOperationStack ) 来设置依赖关系,以便最后一个操作优先于队列中的其余操作 (堆栈行为)。当调用 AFURLConnectionOperation 的 'start' 方法时,我遇到了一个问题,但是由于依赖关系,操作的 'isReady' 方法返回 NO。这使得“开始”立即退出。在第一次尝试开始操作之后,'start' 方法永远不会被再次调用,因此操作永远不会达到 isFinished 状态,永远不会从队列中删除,最终像这样的操作会阻塞队列。我将不胜感激有关此事的任何想法。谢谢!

更多信息:没有任何操作被取消,我在队列中看不到任何依赖圈。我们在现有 operationQueue 上使用 setLIFODependendenciesForOperation 而不更改 AFNetworking 代码:[self.operationQueue setLIFODependendenciesForOperation:operation];

更新:现在,更多地考虑一下,当 NSOperationQueue 决定操作准备好时,是否有可能在某一时刻有零依赖项并让 isReady 返回 YES,但是到那时, start() 被调用,依赖项的数量变为 1或者更多。

4

1 回答 1

5

这听起来像是'NS'OperationStack您正在使用的 Github 项目的问题。

在文档中特别建议不要在将NSOperation依赖项添加到之后更改依赖项:NSOperationQueue

重要在运行操作或将它们添加到操作队列之前,您应该始终配置依赖项。之后添加的依赖项可能不会阻止给定的操作对象运行。(来自:并发编程指南:配置互操作依赖

我认为更好的方法是在操作队列之外维护自己的LIFO堆栈,并使用完成一个操作来触发下一个最重要操作的排队。

或者,如果您不需要严格,也许您可​​以使用-[NSOperation setPriority:]将后面的操作优先于早期的操作。

于 2013-02-12T13:54:44.407 回答