RunLoop-API翻译

Introduction

NSRunLoop 类定义了在程序界面用来管理输入源的对象。一个runloop对象处理从屏幕系统中产生的事件:例如鼠标点击和键盘输入事件,NSPort线程通讯对象和NSConnection 网络链接对象等产生的事件。还有NSTimer定时器产生的事件。

注意1:

你的应用是不能创建或者明确的管理NSRunLoop 对象的。
每条线程对象,包含主线程都会在需要的时候自动创建一个runloop进行对应。如果你需要获取到当前线程的运行循环,你需要使用NSRunLoop的类方法: currentRunLoop.

注意2:

1)从运行循环的角度看,定时器NSTimer 对象比较特殊,不属于输入事件,所以这就意味着当开启定时器的时候不会激活运行循环(需要将定时器手动添加到runloop中)。
2)运行循环不是线程安全的类,它的方法也只能在当前的线程内调用。你不能在其他线程调用另外线程的runloop方法,否则将会出错。

获取运行循环和循环模式

+ currentRunLoop

返回当前线程的runloop对象。如果当前没有runloop存在将会创建一个新的返回。

@property(readonly, copy) NSString *currentMode

runloop的当前输入模式(只读)。
只有当前的运行循环正在运行的时候才会返回当前的输入模式否则返回nil。模式通过运行这个runloop的时候方法设置的:acceptInputForMode:beforeDate:runMode:beforeDate:.

- (NSDate )limitDateForMode:(NSString )mode

在特定的runloop循环模式下处理事件并且返回下一次runloop的触发的时间。

+ mainRunLoop

返回主线程的runloop

- getCFRunLoop

返回在Core Foundation中与之对应的 CFRunLoop Reference 对象。

处理定时器

- addTimer:forMode:

将定时器加入到一个模式的runloop中。runloop将持有这个定时器,会在要移除定时器的时候发送 invalidate 消息给定时器。

运行一个循环

- run

将运行循环加入到一个永久循环中处理所有的输入源事件。如果没有任何输入源事件或者定时器加入到该运行循环,那么会立即退出这个方法;否则就会在NSDefaultRunLoopMode 这个模式下重复调用runMode:beforeDate:这个方法。换句话说,这个方法实际上开启了一个无限循环的loop来处理所有输入源和定时器事件。

- runMode:beforeDate:

一旦运行了该loop,就会阻塞设置的mode下的循环直到设置的日期到达。如果这个loop运行了并且处理了输入源事件或者到了指定的时间将返回yes,如果这个loop没有运行将返回no。如果没有输入源事件或者定时器事件,将会立即退出这个方法并且返回NO,否则一旦第一个输入源事件被处理或者到了限制日期都会返回YES。注意:定时器不属于输入源事件在等待这个方法的返回值时也许会被激活多次。

- runUntilDate:

如果没有输入源事件或者定时器事件,将会立即退出这个方法;否则在指定的日期到达之前会在NSDefaultRunLoopMode 这个模式下重复调用runMode:beforeDate:这个方法。类似于“run”方法。

- acceptInputForMode:beforeDate:

在指定的日期到达之前,只接受指定的模式下的事件。
如果没有输入源事件或者定时器事件,将会立即退出这个方法,否则会这个runloop将被激活一次,只要有输入源事件被处理或者到了指定的时间,就会返回。
注意:定时器不属于输入源事件在等待这个方法的返回值时也许会被激活多次。

预设或者取消消息

-performSelector:target:argument:order:modes:

这个方法为定时器设置了在当前线程的下一个运行循环中将要调用的方法。定时器会根据设置的模式运行该方法。当定时器激活时,当前线程会尝试从当前运行循环中派发出一个消息,并执行该方法。如果当前的runloop还是运行并且符合设置的模式,就会成功调用该方法,否则定时器会等到runloop符合条件时再调用该方法。

- cancelPerformSelector:target:argument:

取消之前通过performSelector:target:argument:order:modes:方法设置的发送消息方法调用。

- cancelPerformSelectorsWithTarget:

取消该target下所有之前设置要执行的方法。

常量

  • NSDefaultRunLoopMode 这种模式下将处理所有输入事件除了NSConnection 对象发送的。
  • NSRunLoopCommonModes 这种模式包含所有被监控的模式。更多请查看CFRunLoopAddCommonMode 。