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