iOS应用程序与调试与发布方案的行为不同

时间:2016-10-05 01:25:12

标签: objective-c asynchronous background-process dispatch-async

在我的应用中,我有三个互联网操作同时运行。他们不相互依赖,所以我在后台线程中运行每一个。在我的应用程序转移到完成处理程序之前,它们都需要完成。

启动三者中的每一个的方法作为参数接收,块代码用作完成处理程序。此方法还有一个名为internetOperationsRemaining的局部变量,在我开始三次互联网操作之前,我将其设置为3。

当每个互联网操作完成后,我会减少主线程上的internetOperationsRemaining。这会导致internetOperationsRemaining == 0,当它们全部完成时。

为了监听这种情况,我在另一个后台线程上运行一个紧密循环,它只是循环自身,等待internetOperationsRemaining等于0.一旦发生这种情况,我调用作为参数传入的完成处理程序,如前所述。

    while(internetOperationsRemaining > 0)
    {
        //Just spins in here on a background thread waiting 
        //on the internet to finish.
        int i=0;
        ++i;
    }

我看到的奇怪的行为是,如果我在方案中有调试集,应用程序运行完美,如果我选择了发布,它就不会运行。它永远不会脱离while循环。

如果我在while循环中插入一些简单的代码来减慢速度,它可以在调试和发布中正常工作。

{{1}}

我无法解释这种行为。紧密循环在后台线程上,因此应用程序仍然可以响应用户输入。我意识到发布方案引入了优化,但我很惊讶它实际上改变了应用程序的行为。

1 个答案:

答案 0 :(得分:1)

如果没有运行代码来检查,我认为正在发生的是某种编译器优化,它只发生在Release代码中。

我认为真正的问题不仅仅是设计问题。使用计数器和线程旋转并不是很好。我建议考虑使用NSOperations。您可以设置操作层次结构,以便完成操作依赖于其他三个操作。阅读使用操作,并发队列和依赖关系,你会得到这个想法。