Ios dispatch\u async仍然阻止我的UI

Ios dispatch\u async仍然阻止我的UI,ios,objective-c,multithreading,grand-central-dispatch,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

我是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之前和之后似乎没有什么不同。

我不确定您对“类似同步的行为”的想法是什么,但您使用的
dispatch\u async
模式的主要好处是动画(如tableView滚动和其他转换)可以在不结巴的情况下继续使用,并且对最终用户来说,应用程序感觉响应迅速。在5秒钟的web服务器调用完成之前,它将无法显示更多数据或根据可用数据更新UI

也许您需要在第一次dispatch_async调用之前使用“loading Data”类型的消息更新单元格,或者显示活动指示器,以通知用户


然后在
dispatch_async
as启动后,用户界面在等待时仍然会感觉到用户的响应(例如滚动表视图等),问题不是gcd代码,也不是如上所示的用户代码

问题是另一个套接字正在侦听指令,当调用
updateRecord
方法时,套接字也在接收一些在主线程上执行的指令。它不是即时的,因此有一种错觉,认为gcd代码由于某种原因无法工作。这也稍微增加了解决问题的难度,因为上面的代码与问题没有直接关系


因此,如果您正在阅读本文,请更广泛地思考您的应用程序是如何工作的(内部),并检查应用程序中还可能运行什么

这种“类似同步的行为”到底是什么?您的意思是,在此
dispatch\u async
之后有一行代码未到达?无论如何,问题不在于上述代码。可能在
updateRecord
方法中。您可以始终使用带有“记录等待线程”选项的工具,如WWDC 2012视频中所示。manager的-updateRecord方法是否线程安全?如果不是,您是否在同一线程上实例化和访问manager的资源?请在
updateRecord
方法中共享您的代码。。似乎出现了一些问题。当UI看起来被阻止时,请单击Xcode中的“暂停程序执行”按钮。主线程的堆栈看起来像什么?
这种“类似同步的行为”到底是什么当我点击一个单元格时,它会滞后。如果我连续单击几个单元格,它的延迟会更大。动画不平滑。计时器也停止递增。是的,updateRecord方法是线程安全的。在主线程中不执行任何内部操作<代码>当UI看起来被阻塞时,单击Xcode中的“暂停程序执行”按钮。
谢谢,我发现了“问题”。谢谢,你的回答为我提供了一些非常有用的信息。