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

iOS Swift 3 DispatchQueue.main.async() in API response closure

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

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

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

为什么会这样?闭包不应该是异步的并处理所有这些吗?我误会了什么吗? 谢谢

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

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

您在使用 URLSessionsdataTask(with:completionHandler:) api 吗?如果是这种情况,completionHandler 将从后台队列中调用。这就是更新 UI 需要一些时间的原因(这里要小心。您也可能会遇到随机崩溃)。