一、NSRunLoop
在Cocoa中,每个线程(NSThread)对象中内部都有一个run loop(NSRunLoop)对象用来循环处理输入事件,处理的事件包括两类,一是来自Input sources的异步事件,一是来自Timer sources的同步事件:
run Loop在处理输入事件时会产生通知,可以通过Core Foundation向线程中添加run-loop observers来监听特定事件,以在监听的事件发生时做附加的处理工作。每个run loop可运行在不同的模式下,一个run loop mode是一个集合,其中包含其监听的若干输入事件源,定时器,以及在事件发生时需要通知的run loop observers。运行在一种mode下的run
loop只会处理其run loop mode中包含的输入源事件,定时器事件,以及通知run loop mode中包含的obeservers。
Cocoa中的预定义模式有:
1.Default模式
定义:NSDefaultRunLoopMode (Cocoa)KCFRunLoopDefaultMode(Core Foundation)
描述:默认模式中几乎包含了所有输入源(NSConnection除外),一般情况下应使用此模式。
2.Connection模式
定义:NSConnectionReplyMode(Cocoa)
描述:处理NSConnection对象相关事件,系统内部使用,用户基本不会使用。
3.Modal模式
定义:NSModalPanelRunLoopMode(Cocoa)
描述:处理modal panels事件。
4.Event tracking模式
定义:UITrackingRunLoopMode(iOS ) NSEventTrackingRunLoopMode(cocoa)
藐视:在拖动loop或其他user interface tracking loops时处于此种模式下,在此模式下会限制输入事件的处理。例如,当手指按住UITabView拖动时就会处于此模式。
5.Common模式
定义:NSRunLoopCommonModes(Cocoa)KCFRunLoopCommonModes(Core Foundation)
描述:这是一个伪模式,其为一组run loop mode的集合,将输入源加入此模式意味着在Common Models中包含的所有模式下都可以处理。在Cocoa应用程序中,默认情况下Common Models包含default modes, modal modes,event Tracking modes,可以使用CFRunLoopAddCommonMode方法向Common Modes中添加自定义modes。
获取当前线程的run loop mode
NSString *runLoopMode =[ [NSRunLoop currentRunLoop] currentMode];
二、NSTimer、NSURLConnection与UITrackingRunLoopMode
NSTimer与NSURLConnection默认运行在default mode下,这样当用户在拖动UITableView处于UITrackingRunLoopMode模式时,NSTimer不能fire,NSURLConnection的数据也无法处理。