我对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之前和之后似乎没有任何区别。
答案 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代码由于某种原因不起作用。这也略微增加了解决问题的难度,因为上面的代码与问题没有直接关系。
因此,如果您正在阅读本文,请更广泛地考虑您的应用的工作方式(内部),并检查应用中还有哪些内容可以运行!