一些奇怪的问题你async一下就好了

719 阅读1分钟

iOS开发中的一些UI问题可能你把函数放在DispatchQueue.main.async{} 的闭包中去执行就会发现一些意想不到的结果。

如果这样就解决了你的问题,难道你不想知道到底是为什么嘛?

我来介绍一下我所发现的本质,介于无法看到这部分的源码,所以我通过一个Demo获得了原因。

关于Queue与Thread的基础知识

  • Queues:1. Main Queue(只有一个你懂的吧) 2. 4个Global Queue 3. 任意数量的自定义Queue
  • Threads: 1个主线程和其他任意系统提供的子线程

DispatchQueue.main.async:

  • 使用后台子线程执行闭包里的代码,当任务完成时自动更新到UI,整个任务都是在主队列中的

DispatchQueue.global().async:

  • 使用后台子线程在全局队列中执行闭包里的代码,当任务完成后代入主队列去更新UI

解决一些诡异UI问题的原因

我感觉贴一张图大家就懂了:

  • 你会发现Async闭包里面的内容是放在所有UI生命周期函数之后才会去执行的
  • 原因呢是这个闭包的实现是放在RunLoop的最后一步

应用场景:

  • 旋转之后的UI刷新,需要等待旋转完全完成,又需要平滑地改变,你可以这么用:

override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() DispatchQueue.main.async { // code snippet } }

  • 其他的场景我也有点忘了哈哈,反正RunLoop的底层就行。

一点小经验之谈,大家能取之用之我就很开心了!