美文网首页
UI操作为什么要在主线程

UI操作为什么要在主线程

作者: 0fbf551ff6fb | 来源:发表于2019-03-07 15:18 被阅读0次

一、从线程安全方面考虑

在UIKit里面很多类都是被修饰为nonatomic,这意味着它们不能在多线程的环境下工作,而对于UIKit这样一个庞大的框架,将其所有属性都设计为线程安全是不现实的,这可不仅仅是简单的将nonatomic改成atomic或者是加锁解锁的操作。

假设能够异步设置view的属性,那我们究竟是希望这些改动能够同时生效,还是按照各自runloop的进度去改变这个view的属性呢?

假设UITableView在其他线程去移除了一个cell,而在另一个线程却对这个cell所在的index进行一些操作,这时候可能就会引发crash。

如果在后台线程移除了一个view,这个时候runloop周期还没有完结,用户在主线程点击了这个“将要”消失的view,那么究竟该不该响应事件?在哪条线程进行响应?

二、Runloop 与绘图循环

UIApplication在主线程所初始化的Runloop我们称为Main Runloop,它负责处理app存活期间的大部分事件,如用户交互等,它一直处于不断处理事件和休眠的循环之中,以确保能尽快的将用户事件传递给GPU进行渲染,使用户行为能够得到响应,画面之所以能够得到不断刷新也是因为Main Runloop在驱动着。

而每一个view的变化的修改并不是立刻变化,相反的会在当前run loop的结束的时候统一进行重绘,这样设计的目的是为了能够在一个runloop里面处理好所有需要变化的view,包括resize、hide、reposition等等,所有view的改变都能在同一时间生效,这样能够更高效的处理绘制,这个机制被称为绘图循环(View Drawing Cycle)。

假设这个时候我们应用了我们的魔法UIKit,并愉快的在一条后台线程操作UI,但当我们需要对设备进行旋转并重新布局的时候,问题来了,因为各个线程之间不同步,这时候各个view修改的请求时机是零碎的,所以所有的旋转变化并不能在Main Runloop的一个runloop里面处理完,这就导致设备旋转之后还有一些view迟迟没有旋转。

相关文章

  • iOS 线程与队列之间的关系

    引导问题:UI刷新,为什么需要在主线程中执行? 原因一:UIKit的操作不是线程安全的 在多个线程下进行UI操作,...

  • Android-异步操作更新UI界面的几种方法

    在Android开发中,耗时操作是比较多的,更新ui需要在主线程中,然而耗时操作是不能放在主UI线程中在执行的,因...

  • iOS-多线程初探

    线程的定义 为什么一定要在主线程刷新UI? 因为UIKit框架不是线程安全的,当在多个线程进行UI操作,有可能出现...

  • UI问题总结

    1、为什么一定要在主线程刷新UI? 安全+效率:因为UIKit框架不是线程安全的框架,当在多个线程进行UI操作,有...

  • IOS为什么在主线程刷新UI?(子线程刷新UI测试)

    为什么一定要在主线程刷新UI?安全+效率:因为UIKit框架不是线程安全的框架,当在多个线程进行UI操作,有可能出...

  • AsyncTask和线程池

    在Android中,UI操作是线程不安全的,如果想要在子线程中进行UI操作,或者在主线程中进行耗时操作,则需要借助...

  • iOS拾遗——为什么必须在主线程操作UI

    iOS拾遗——为什么必须在主线程操作UI iOS拾遗——为什么必须在主线程操作UI

  • Handler消息机制

    Android规定只允许UI线程修改Activity里面的UI组件,如果我们要在子线程中去执行更改UI的操作,会导...

  • 为什么要在主线程操作UI

    UIKit不是线程安全的试想下面这几种情况: 1.两个线程同时设置同一个背景图片,那么很有可能因为当前图片被释放了...

  • iOS中为什么刷新UI要在主线程

    刷新UI要在主线程(简单记个笔记,加深自我理解) 在iOS中,为什么刷新UI要在主线程呢,因为UIKit框架本身就...

网友评论

      本文标题:UI操作为什么要在主线程

      本文链接:https://www.haomeiwen.com/subject/ytscpqtx.html