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

时间:2017-07-24 12:34:44

标签: ios swift grand-central-dispatch

所以我正在从API服务解析json响应,并在响应解析闭包中更新UI,该闭包应该是异步发生的。

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

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

为什么会这样?关闭不应该是异步并且照顾所有这些吗?我误会了什么吗? 感谢

2 个答案:

答案 0 :(得分:1)

是的,我的朋友,你在这里遗漏了一些东西。闭包本身不应该是异步的。即使是你定义的普通函数也是闭包。关闭不是一个可以照顾你的魔杖。它只是一个可以传递的语句块。

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

答案 1 :(得分:1)

您使用的是URLSessions的{​​{1}} api吗?如果是这种情况,则从后台队列调用dataTask(with:completionHandler:)。这就是为什么需要一些时间来更新UI(这里要小心。你也可以随机崩溃)。