• IOS


    什么是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");
     
  • 相关阅读:
    图论 拓扑排序
    图论 k短路
    图论 最短路 spfa
    12.14 操作系统实验:linux虚拟机与进程管理
    Anaconda 换用清华园后安装速度依然很慢,或者安装包出错
    6.21 在panel中设置背景并不覆盖控件--paintComponent
    1.15 关于String类型和其他主数据类型相互转换的方法 (转)
    1.14 Headfirstjava第五章 简单游戏代码
    1.14 HeadFirstJava 前六章读书笔记总结
    1.22训练赛 --ac2
  • 原文地址:https://www.cnblogs.com/DreamLinku/p/5745077.html
Copyright © 2020-2023  润新知