为什么在主线程刷新UI

为什么在主线程刷新UI

2023年7月14日发(作者:)

为什么在主线程刷新UI像UIKit这样⼤的框架上确保线程安全是⼀个重⼤的任务,会带来巨⼤的成本。UIKit不是线程安全的⽐如:某⼀个线程中遍历找寻某个subView,然⽽在另⼀个线程中删除了该subView,那么就会出现问题事实上在⼦线程中如果要对其他UI 进⾏更新,必须等到该⼦线程运⾏结束。⽽⼦线程结束了,相当于是⼜回到了主线程。在⼦线程中是不能进⾏UI 更新的,我们看到的UI更新其实是⼦线程代码执⾏完毕了,⼜⾃动进⼊到了主线程,执⾏了⼦线程中的UI更新的函数栈,这中间的时间⾮常的短,就让⼤家误以为分线程可以更新UI。如果⼦线程⼀直在运⾏,则⼦线程中的UI更新的函数栈 主线程⽆法获知,即⽆法更新。只有极少数的UI能直接进⾏UI更新,因为开辟线程时会获取当前环境,如点击某个按钮,这个按钮响应的⽅法是开辟⼀个⼦线程,在⼦线程中对该按钮进⾏UI 更新是能及时的。⼀、出于安全⽅⾯考虑因为UIKit框架不是线程安全的,当多个线程同时操作UI的时候,抢夺资源,导致崩溃,UI异常等问题。假如在两个线程中设置了同⼀张背景图⽚,很有可能就会由于背景图⽚被释放两次,使得程序崩溃。或者某⼀个线程中遍历找寻某个subView,然⽽在另⼀个线程中删除了该subView,那么就会造成错乱。apple有对⼤部分的绘图⽅法和诸如UIColor等类改写成线程安全可⽤,可还是建议将UI操作保证在主线程中。例如说,我们需要在⼦线程中读取⼀个image对象,使⽤接⼝ [UIImage imageNamed:] ,但 imageNamed: 实际上在 iOS9 以后才是线程安全的, iOS9 之前都需要在主线程获取。所以,我们需要从⼦线程切换到主线程获取image,然后再切回⼦线程拿到这个image,这⾥我们必须使⽤sync。⼆、出于⽤户的体验iOS中只有主线程才能⽴即刷新UI。在⼦线程中是不能够更新UI,我们看到的⼦线程能够更新UI的原因是,等到⼦线程执⾏完毕,⾃动进⼊了主线程去执⾏⼦线程中更新UI的代码。由于⼦线程执⾏时间⾮常短暂,让我们误以为⼦线程可以更新UI。如果⼦线程⼀直在运⾏,则⽆法更新UI,因为没有办法进⼊主线程。主线程中⽤于显⽰刷新UI界⾯,处理UI事件(⽐如点击事件、滚动事件、拖拽事件等)。耗时操作会卡住主线程,严重影响UI的流畅度,给⽤户⼀种“卡”的坏体验,所以解决办法是:异步开启⼀条⼦线程,让耗时操作在⼦线程中完成,这样⼜不会影响主线程的任务。当⼦线程中的任务完成之后,回到主线程刷新UI,显⽰UI即可。三、程序⼀开始运⾏就进⼊了主线程在⼦线程中,如果要对UI进⾏更新,只有两种做法:做法1:等到该⼦线程运⾏结束,⼦线程结束之后系统⾃动回到主线程新UI做法2:不⽤等到该⼦线程运⾏结束,我们直接在UI代码的外⾯写上GCD的异步函数+主队列,就可以实现⽴即主线程更新UI

发布者:admin,转转请注明出处:http://www.yc00.com/news/1689265059a226450.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信