新余建网站,wordpress黄页插件,百合居装饰公司官网,企业网站建设模拟实验一.NSRunLoop 在Cocoa中#xff0c;每个线程(NSThread)对象中内部都有一个run loop#xff08;NSRunLoop#xff09;对象用来循环处理输入事件#xff0c;处理的事件包括两类#xff0c;一是来自Input sources的异步事件#xff0c;一是来自Timer sources的同步事件;run … 一.NSRunLoop 在Cocoa中每个线程(NSThread)对象中内部都有一个run loopNSRunLoop对象用来循环处理输入事件处理的事件包括两类一是来自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中包含的observers。Cocoa中的预定义模式有: Default模式定义NSDefaultRunLoopMode (Cocoa) kCFRunLoopDefaultMode (Core Foundation)描述默认模式中几乎包含了所有输入源(NSConnection除外),一般情况下应使用此模式。Connection模式定义NSConnectionReplyMode(Cocoa)描述处理NSConnection对象相关事件系统内部使用用户基本不会使用。Modal模式定义NSModalPanelRunLoopMode(Cocoa)描述处理modal panels事件。Event tracking模式定义UITrackingRunLoopMode(iOS) NSEventTrackingRunLoopMode(cocoa)描述在拖动loop或其他user interface tracking loops时处于此种模式下在此模式下会限制输入事件的处理。例如当手指按住UITableView拖动时就会处于此模式。Common模式定义NSRunLoopCommonModes (Cocoa) kCFRunLoopCommonModes (Core Foundation)描述这是一个伪模式其为一组run loop mode的集合将输入源加入此模式意味着在Common Modes中包含的所有模式下都可以处理。在Cocoa应用程序中默认情况下Common Modes包含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的数据也无法处理。NSTimer的例子:在一个UITableViewController中启动一个0.2s的循环定时器在定时器到期时更新一个计数器并显示在label上。 -(void)viewDidLoad
{label [[[UILabel alloc]initWithFrame:CGRectMake(10, 100, 100, 50)]autorelease];[self.view addSubview:label];count 0;NSTimer *timer [NSTimer scheduledTimerWithTimeInterval: 1target: selfselector: selector(incrementCounter:)userInfo: nilrepeats: YES];
}- (void)incrementCounter:(NSTimer *)theTimer
{count;label.text [NSString stringWithFormat:%d,count];
} 在正常情况下可看到每隔0.2slabel上显示的数字1,但当你拖动或按住tableView时label上的数字不再更新当你手指离开时label上的数字继续更新。当你拖动UItableView时当前线程run loop处于UIEventTrackingRunLoopMode模式在这种模式下不处理定时器事件即定时器无法fire,label上的数字也就无法更新。解决方法一种方法是在另外的线程中处理定时器事件可把Timer加入到NSOperation中在另一个线程中调度;还有一种方法时修改Timer运行的run loop模式将其加入到UITrackingRunLoopMode模式或NSRunLoopCommonModes模式中。即 [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode]; 或 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; NSURLConnection也是如此见SDWebImage中的描述,以及SDWebImageDownloader.m代码中的实现。修改NSURLConnection的运行模式可使用scheduleInRunLoop:forMode:方法。 NSURLRequest *request [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];NSURLConnection *connection [[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]autorelease];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[connection start]; 参考:Threading Programming Guide – Run LoopsNSRunLoop Class ReferenceNSURLConnection Class ReferenceNSTimer Class ReferenceCFRunLoop wikiSDWebImageTestButtonDownNSTimerDoesntRunWhenMenuClicked http://www.winddisk.com/2012/06/29/nstimer_run_loop_modes/ http://blog.csdn.net/jasonblog/article/details/7854693 转载于:https://www.cnblogs.com/Piosa/archive/2012/10/30/2746652.html