NSRunLoop就是一个事件处理循环,用来不停的监听和处理输入事件并将其分配到对应的目标上进行处理。
首先,NSRunLoop是一种更加高明的消息处理模式,他就高明在对消息处理过程进行了更好的抽象和封装,这样才能是的你不用处理一些很琐碎很低层次的具体消息的处理,在NSRunLoop中每一个消息就被打包在input source或者是timer source中。它还可以处理使线程阻塞的工作。
其次,也是很重要的一点,使用run loop可以使你的线程在有工作的时候工作,没有工作的时候休眠,这可以大大节省系统资源。
runloop 传递异步事件,通常消息来自于其他线程或程序。输入源传递异步消息给相应的处理例程,并调用runUntilDate:方法来退出(在线程里面相关的NSRunLoop对象调用)。
- (IBAction)start:(id)sender
{
pageStillLoading = YES;
[NSThread detachNewThreadSelector:@selector(loadPageInBackground)toTarget:self withObject:nil];
NSLog(@"--->>>>>>>[progress setHidden:NO];");
while (pageStillLoading) {
// 使用[NSDate distantFuture]会一直处于等待状态,等待再次执行start方法
// [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
// 使用[NSDate dateWithTimeIntervalSinceNow:5] 会在loadPageInBackground执行完毕5秒后执行后面的语句。
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
}
if (!pageStillLoading) {
NSLog(@"pageStillLoading is %d",pageStillLoading);
}
NSLog(@"--->>>>>>>[progress setHidden:YES];");
}
- (void)loadPageInBackground{
int maxNum = 1000;
for (int i = 0; i < maxNum; i++) {
NSLog(@"%s by i = %d",__FUNCTION__,i);
if (maxNum == i+1) {
pageStillLoading = NO;
}
}
}