所以我正在从API服务解析json响应,并在响应解析闭包中更新UI,该闭包应该是异步发生的。
我注意到 - 尽管我从控制台日志中可以看出API的响应非常快 - 但UI不会立即更新。更新需要几秒钟。
所以我搜索了一下,我发现将我的UI更新代码放在DispatchQueue.main.async()
中会修复它。
为什么会这样?关闭不应该是异步并且照顾所有这些吗?我误会了什么吗? 感谢
答案 0 :(得分:1)
是的,我的朋友,你在这里遗漏了一些东西。闭包本身不应该是异步的。即使是你定义的普通函数也是闭包。关闭不是一个可以照顾你的魔杖。它只是一个可以传递的语句块。
正如您所说,响应速度很快但UI不会自动更新,可能需要花时间进行解析。确保您没有在主队列上执行解析部分,只有UI更新应该在主队列上。
答案 1 :(得分:1)
您使用的是URLSessions
的{{1}} api吗?如果是这种情况,则从后台队列调用dataTask(with:completionHandler:)
。这就是为什么需要一些时间来更新UI(这里要小心。你也可以随机崩溃)。