关于View 的 Redrawing 与 Run Loop
- 当 application 启动后,它会开始一个 run loop 用以监听如触摸一类的事件。当事件触发时,run loop 会寻找合适的处理事件方法,这个处理方法又会调用其他方法来处理,一旦所有方法被执行完毕,控制权会被交还给 run loop。
- 当 run loop 重新获得控制权后,它会检查一个名为 dirty list 的列表,其中包含需要重新绘制的 view 。然后 run loop 会在整个 hierarchy 中的 view 被重新叠加在一起前,发送 drawRect: 消息给 dirty list 中的 view 。
- 需要优化的部分(以便保持界面随时可响应):
- 只重新渲染必要的 view
- 每个 event 只发送一次 drawRect: 消息
- 在 run loop 的最后批量处理需要重绘的 view 以避免不必要的重复重绘
- 当完成了对事件的响应,并将控制权交还给 run loop 后,若该 view 发生了改变,则还需要将该 view 加入 dirty list。原生的 view 会自动进行这项工作,而自定义的 view 则需要手动向它自身发送 setNeedDisplay 消息。
- 可选的优化方法(不常用):
- 通过发送 setNeedsDisplayInRect: 消息,只标记 view 的一部分需要重绘。
- 该方法比较复杂且对性能没有显著提升,因此除非重绘过程明显拖慢了 app ,否则一般不使用。