2023年7月13日发(作者:)
iOS⼦线程操作UI⾸先声明⼀点:⼦线程⾥⾯是可以更新UI的。之所以说⼦线程不能操作UI是因为UIKit不是线程安全的。UI操作涉及到渲染访问各种View对象的属性,如果异步操作下会存在读写问题,⽽为其加锁则会耗费⼤量资源并拖慢运⾏速度。另⼀⽅⾯因为整个程序的起点UIApplication是在主线程进⾏初始化,所有的⽤户事件都是在主线程上进⾏传递(如点击、拖动),所以view只能在主线程上才能对事件进⾏响应。⽽在渲染⽅⾯由于图像的渲染需要以60帧的刷新率在屏幕上 同时 更新,在⾮主线程异步化的情况下⽆法确定这个处理过程能够实现同步更新。只有极少数的UI能,因为开辟线程时会获取当前环境,如点击某个按钮,这个按钮响应的⽅法是开辟⼀个⼦线程,在⼦线程中对该按钮进⾏UI 更新是能及时的,如换标题,换背景图,但这没有任何意义。试想下⾯这⼏种情况:1.两个线程同时设置同⼀个背景图⽚,那么很有可能因为当前图⽚被释放了两次⽽导致应⽤崩溃。2.两个线程同时设置同⼀个UIView的背景颜⾊,那么很有可能渲染显⽰的是颜⾊A,⽽此时在UIView逻辑树上的背景颜⾊属性为B。3.两个线程同时操作view的树形结构:在线程A中for循环遍历并操作当前View的所有subView,然后此时线程B中将某个subView直接删除,这就导致了错乱还可能导致应⽤崩溃。iOS4之后苹果将⼤部分绘图的⽅法和诸如 UIColor 和 UIFont 这样的类改写为了线程安全可⽤,但是仍然强烈建议讲UI操作保证在主线程中执⾏。在主队列中的任务,⼀定会放到主线程执⾏; 所以只要是在主队列中的任务,既可以保证在主队列,也可以保证在主线程中执⾏。UI更新⼀定要在UI线程⾥实现的原因⽬的在于提⾼移动端更新UI的效率和和安全性,以此带来流畅的体验。原因是:移动端(安卓和iOS)的UI访问是没有加锁的,多个线程可以同时访问更新操作同⼀个UI控件。也就是说访问UI的时候,系统当中的控件都不是线程安全的,这将导致在多线程模式下,当多个线程共同访问更新操作同⼀个UI控件时容易发⽣不可控的错误,⽽这是致命的。所以规定只能在UI线程中访问UI,这相当于从另⼀个⾓度给移动端的UI访问加上锁,⼀个伪锁。多线程处理UI并没有给我们开发带来更多的便利,假如你代⼊了这些情景进⾏思考,你很容易得出⼀个结论: “我在⼀个串⾏队列对这些事件进⾏处理就可以了。” 苹果也是这样想的,所以UIKit的所有操作都要放到主线程串⾏执⾏。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689262478a226322.html
评论列表(0条)