码迷,mamicode.com
首页 > 移动开发 > 详细

IOS - RunLoop消息循环

时间:2016-08-06 23:23:16      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

什么是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");

 

 

 

IOS - RunLoop消息循环

标签:

原文地址:http://www.cnblogs.com/DreamLinku/p/5745077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!