一个RunLoop对象可以处理鼠标、键盘输入,端口对象输入,NSConnection对象输入。它也可以处理NSTimer事件。
你的应用不用创建或很清晰地管理RunLoop对象。每个线程(包括应用主线程),都有一个自动创建好的RunLoop对象。如果你需要使用当前线程的RunLoop,你需要使用类方法 currentRunLoop。
应当注意到,从RunLoop角度来看的话,NSTimer对象并不是一个“输入”,它们是一个特殊的类型。这意味着当NSTimer启动时,不会引起RunLoop。
警告:
RunLoop类一般不认为是线程安全的,它的方法应当只被当前线程的上下文调用。你应该永远不要尝试调用其他线程中的RunLoop的方法,因为这样可能导致无法预料的结果。
话题
获取RunLoop和Mode
currentRunLoop
返回当前线程的run loop
currentMode
接受者当前的input mode
- limitDateForMode:
获取下一个响应时间
mainRunLoop
返回主线程的RunLoop
- getCFRunLoop
返回接受者的下属的CFRunLoop对象
NSRunLoopMode
NSRunLoopCommonModes:被添加到这个模式下RunLoop的对象,会被所有mode处在common modes声明中的RunLoop监视。
NSDefaultRunLoopMode:这个模式是用来处理除了NSConnection对象之外的输入源。
NSEventTrackingRunLoopMode:这个模式适用用以下情况:鼠标拖拽循环。
NSModalPanelRunLoopMode:当等待从遮罩层的输入,例如NSSavePanel、NSOpenPanel,一个RunLoop应当被设定为这个mode。
UITrackingRunLoopMode:拖拽时设置为这个mode,你可以用这个模式来添加timer,这样拖拽时timer会继续触发。
管理Timers
- addTimer: forMode:
适用指定的input mode,注册一个给定的timer
管理端口
- addPort: forMode:
添加一个port,作为输入源,添加到指定的mode中
- removePort: forMode:
移除一个port,从指定的mode中
运行一个循环
- run
把接收者放进一个死循环中,在这个循环中,接收者会处理来自与它相连的输入源所输入的一切数据
- runMode: beforeDate:
启动run loop一次,在特定的mode下等待输入,直到给定的时间
- runUntilDate:
启动run loop直到给定的时间,在这期间它会处理相连数据源的数据
- acceptInputForMode: beforeDate:
启动run loop一次,或者直到指定的时间,只接受给定mode的输入
计划发送和取消发送消息
- performSelector: target: argument: order: modes:
计划发送消息
- cancelPerformSelector: target: argument:
取消之前计划发送的消息
- cancelPerformSelectorsWithTarget:
取消指定目标的所有未响应的消息
实例方法
- performBlock:
- performInModes: block: