API响应关闭中的iOS Swift 3 DispatchQueue.main.async()

API响应关闭中的iOS Swift 3 DispatchQueue.main.async(),ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,因此,我正在解析来自API服务的json响应,并在响应解析闭包中更新UI,这应该是异步发生的 我注意到,尽管API的响应非常快,从控制台日志中可以看出,但UI并没有立即更新。更新需要几秒钟 所以我搜索了一下,发现将UI更新代码放在DispatchQueue.main.async()中可以修复它 为什么会这样?闭包不应该是异步的吗?我是不是误解了什么? 谢谢是的,我的朋友,你错过了一些东西。闭包本质上不应该是异步的。即使您定义的普通函数也是闭包。闭包不是为你解决所有问题的魔杖。它只是一个可以传递的

因此,我正在解析来自API服务的json响应,并在响应解析闭包中更新UI,这应该是异步发生的

我注意到,尽管API的响应非常快,从控制台日志中可以看出,但UI并没有立即更新。更新需要几秒钟

所以我搜索了一下,发现将UI更新代码放在
DispatchQueue.main.async()
中可以修复它

为什么会这样?闭包不应该是异步的吗?我是不是误解了什么?
谢谢

是的,我的朋友,你错过了一些东西。闭包本质上不应该是异步的。即使您定义的普通函数也是闭包。闭包不是为你解决所有问题的魔杖。它只是一个可以传递的语句块


正如您所说,响应速度很快,但UI不会自动更新,解析过程可能需要一些时间。确保您没有在主队列上执行解析部分,只有UI更新应该在主队列上

是的,我的朋友,你错过了一些东西。闭包本质上不应该是异步的。即使您定义的普通函数也是闭包。闭包不是为你解决所有问题的魔杖。它只是一个可以传递的语句块


正如您所说,响应速度很快,但UI不会自动更新,解析过程可能需要一些时间。确保您没有在主队列上执行解析部分,只有UI更新应该在主队列上

您是否正在使用
URLSessions
dataTask(带有:completionHandler:)
api?如果是这种情况,则从后台队列调用
completionHandler
。这就是为什么更新UI需要一些时间的原因(这里要小心,你也可能会随机崩溃)

您是否正在使用
URLSessions
dataTask(带有:completionHandler:)
api?如果是这种情况,则从后台队列调用
completionHandler
。这就是为什么更新UI需要一些时间的原因(这里要小心,你也可能会随机崩溃)

您知道API服务调用/回调发生在哪个线程上吗?此外,这可能会有所帮助:您知道API服务调用/回调发生在哪个线程上吗?此外,这可能有助于: