dispatch_async仍然阻止我的UI

时间:2015-04-17 11:42:58

标签: ios objective-c multithreading grand-central-dispatch

我对GCD很新,我不确定我做错了什么。我的代码是这样的:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                if([manager updateRecord:foodRecord]) // this function will connect to a web server, and might take a few seconds. If I remove it, the UI will be smooth as butter
                {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [cell expandAnimation]; // this function calls a series of UIView animateWithDuration to basically scale the cell and then call a reloadData when it's done
                    });
                }
            });

知道为什么它仍会导致同步行为吗?在我尝试使用GCD之前和之后似乎没有任何区别。

2 个答案:

答案 0 :(得分:0)

我不确定你对"同步行为的看法"只有dispatch_async模式的主要好处是动画(例如tableView滚动和其他过渡)可以继续而不会出现口吃,对于最终用户,应用程序会感觉响应。在5秒Web服务器调用完成之前,它将无法显示任何更多数据或基于可用数据更新UI。

也许您需要使用" loading data"来更新单元格。在第一次dispatch_async调用之前键入消息或显示活动指示符以通知用户。

然后在启动dispatch_async之后,UI仍然会在等待< 5秒时为用户感觉到响应(例如,可滚动的tableView等)。然后在dispatch_async回到主队列这个" loading"可以删除UI状态(在此插入设计师魔法),然后调用[cell expandAnimation];完成它。

如果您仍然看到用户界面上的口吃,那么[manager updateRecord:foodRecord]可能会对返回的网络数据进行非常繁重的处理,可以使用TimeProfiler工具进行进一步调查,但我认为这是一个独立的问题。

答案 1 :(得分:0)

问题不在于上面显示的gcd代码和用户代码。

问题是另一个监听指令的套接字,当调用updateRecord方法时,套接字也接收了一些在主线程上完成的指令。它不是瞬间的,因此幻觉gcd代码由于某种原因不起作用。这也略微增加了解决问题的难度,因为上面的代码与问题没有直接关系。

因此,如果您正在阅读本文,请更广泛地考虑您的应用的工作方式(内部),并检查应用中还有哪些内容可以运行!