【问题标题】:AFURLConnectionOperation 'start' method gets called before it is ready and never gets called again afterwardsAFURLConnectionOperation 'start' 方法在它准备好之前被调用,之后再也不会被调用
【发布时间】:2013-02-11 21:44:10
【问题描述】:

我们在我们的应用程序中使用 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 个或更多。

【问题讨论】:

    标签: objective-c afnetworking nsoperation


    【解决方案1】:

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

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

    重要 在运行操作或将它们添加到操作队列之前,您应该始终配置依赖项。之后添加的依赖项可能不会阻止给定的操作对象运行。 (来自:Concurrency Programming Guide: Configuring Interoperation Dependencies

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

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

    【讨论】:

    • 谢谢你,罗里。我认为这几乎回答了这个问题。非常感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 2016-04-07
    相关资源
    最近更新 更多