iOS runLoop 理解

时间:2022-01-24 00:01:02

目录

  • 概述

  • run loop modes

一、概述

  run loop叫事件处理循环,就是循环地接受各种各样的事件。run loop是oc用来管理线程里异步事件的工具。一个线程通过run loop可以监听多个事件源(input、timer),当没有任何事件发生时run loop置线程于休眠状态,当事件到达时run loop唤醒线程处理这些事件。

  系统会给每个线程(包过main thread)关联一个run loop对象,所以我们不需要手动的为每个线程创建run loop对象(通过[NSRunLoop currentRunLoop]可以获取)。

  iOS程序在启动的时候,系统会自动启动main thread的run loop对象。其他线程的run loop对象并不会被系统自动运行,需要你在合适的时候手动的启动。  

  run loop有只有两种事件来源:input Sources 、timer Sources。

  下图runloop运行机构图:

iOS runLoop 理解

  runloop 除了处理这些事件来源,还会把整个处理事件源的过程以通知的方式发送给runloop的观察者。

二、run loop modes

  一个runloop modes 是指一个被监听的事件源的集合。每个事件源直接或者间接的关联着一个runloop modes。

  runloop 每次 run 时都必须直接或者间接的指定一个 modes,在这次 loop 当中只有关联了此 modes 的事件源才能被监听和递交处理(观察者也只有在关联了此 modes 的情况下才能被通知)。关联其他的 modes 的事件源将不被监听和处理,直到runloop 运行在适合的 modes时它们才会被处理。

  下表是modes的描述

Mode

Name

Description

Default

NSDefaultRunLoopMode (Cocoa)

kCFRunLoopDefaultMode (Core Foundation)

默认的mode,大多数情况是用这个mode运行runloop

Connection

NSConnectionReplyMode(Cocoa)

Cocoa 用这个模式来监听NSConnection对象的事件,我们不会用到这个mode

Modal

NSModalPanelRunLoopMode(Cocoa)

Cocoa 用这个模式来标识 modal panels(模态).

Event tracking

NSEventTrackingRunLoopMode(Cocoa)

在鼠标拖动的过程中,Cocoa用这个模式来限制其他mode的监听与处理一提高UI交互的高效性。

Common modes

NSRunLoopCommonModes (Cocoa)

kCFRunLoopCommonModes (Core Foundation)

是一个集合

cocoa下包含:

default, modal, and event tracking modes

Core Foundation下包含:

default

  注意,创建一个NSTimer时,系统默认把这个定时器关联到NSDefaultRunLoopMode下,所以当滑动tableView时,即使定时器到点了也不会被触发的。这种情况,可以通过把timer关联到NSRunLoopCommonModes 来解决。