IOS - RunLoop消息循环

什么是RunLoop?

  -RunLoop就是消息循环,每一个线程内部都有一个消息循环。
  -只有主线程的消息循环默认开启,子线程的消息循环默认不开启。 
 
RunLoop的目的
  -保证程序不退出 。
  -负责处理输入事件。
    -如果没有事件发生,会让程序进入休眠状态  。
 
事件类型
Input Sources (输入源) & Timer Sources (定时源)

  -输入源可以是键盘鼠标,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");

 

 

 

posted on 2016-08-06 22:48  DreamLinku  阅读(238)  评论(0编辑  收藏  举报