标签:
什么是RunLoop?
-输入源可以是键盘鼠标,NSPort, NSConnection 等对象,定时源是NSTimer 事件
-创建输入源。(以NSTimer为例)
-指定该事件(源)在循环中运行的模式,并加入循环。
[self performSelector:@selector(demo2) onThread:thread withObject:nil waitUntilDone:NO]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
循环常用模式
NSDefaultRunLoopMode--默认模式
NSRunLoopCommonModes--普通模式
//1.NSTimer定时源 NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(demo) userInfo:nil repeats:YES]; //2.把定时源加入到当前线程的消息循环中 /* 1.定时源 2.模式 NSDefaultRunLoopMode 触摸界面->timer停止->手放开->timer运行 NSRunLoopCommonModes 触摸界面不受影响 触摸界面kCFRunLoopDefaultMode->UITrackingRunLoopMode->手放开->kCFRunLoopDefaultMode */ [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; //3.当消息循环的模式和消息的模式相匹配,消息才能运行
总结
1.创建消息
2.把消息放入循环,并指定消息运行的模式
3.在与循环的模式匹配的时候,消息运行
子线程中的消息循环
//子线程的消息循环 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(demo) object:nil]; [thread start]; //输入源 /* 1.方法 2.线程 3.参数 4.是否等待方法的完成 */ //创建输入源,加入到子线程的消息循环 //只有主线程的消息循环默认开启,子线程的消息循环默认不开启。->手动开启子线程的消息循环 [self performSelector:@selector(talk) onThread:thread withObject:nil waitUntilDone:NO];
-(void)demo{ NSLog(@"demo is running"); // NSLog(@"%@",[NSRunLoop currentRunLoop].currentMode); //手动开启子线程的消息循环 //1.run方法开了关不了OC [[NSRunLoop currentRunLoop] run]; //2.指定时间->不靠谱 不确定方法具体执行的时长等等因素 // [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; //3.apple推荐(了解) // BOOL shouldKeepRunning = YES; // global // NSRunLoop *theRL = [NSRunLoop currentRunLoop]; // while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); NSLog(@"ok");
标签:
原文地址:http://www.cnblogs.com/DreamLinku/p/5745077.html