博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS - OC RunLoop 运行循环/消息循环
阅读量:6265 次
发布时间:2019-06-22

本文共 2514 字,大约阅读时间需要 8 分钟。

1、RunLoop

  • 1)运行循环:

    • 运行循环在 iOS 开发中几乎不用,但是概念的理解却非常重要。

    • 同一个方法中的代码一般都在同一个运行循环中执行,运行循环监听 UI 界面的修改事件,待本次运行循环结束时,统一将界面的修改渲染出来。
    • 点击事件触发结束后立即结束本次运行循环。

    • 作用:

      • 保证程序不退出。
      • 负责监听所有事件,例如:手势触摸,时钟触发,网络加载数据完成等。
    • 特性:

      • 没有事件时,会休眠(省电),一旦监听到事件,会立即响应。
      • 每一个线程都有一个 runloop,但是只有主线程的 runloop 会默认启动。子线程的运行循环默认是不启动的。
  • 2)子线程运行循环:

    • 子线程的运行循环默认是不启动的。

    • 启动运行循环后,如果不停止运行循环,不会执行后续的任何代码,会形成一个死循环。

    • 一旦停止了运行循环,后续代码能够执行,执行完毕后,线程被自动销毁。

  • 3)响应者链条事件监听过程:

    RunLoop1

2、运行循环的使用

2.1 时钟调度

/*        - (void)addTimer:(NSTimer *)timer forMode:(NSString *)mode;                NSDefaultRunLoopMode: 时钟,网络。           发生用户交互的时候,时钟会被暂停        NSRunLoopCommonModes: 用户交互,响应级别高。   发生用户交互的时候,时钟仍然会触发,如果时钟触发方法非常耗时,                                                   使用此方式时用户操作会造成非常严重的卡顿。    */
  • 以 NSRunLoopCommonModes 方式创建

    // 调度时钟    self.timer = [NSTimer timerWithTimeInterval:1.0                                          target:self                                        selector:@selector(updateTimer)                                        userInfo:nil                                         repeats:YES];    // 将时钟以 NSRunLoopCommonModes 模式添加到运行循环    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
  • 以 NSDefaultRunLoopMode 方式创建

    // 调度时钟    /*        默认将时钟以 NSDefaultRunLoopMode 模式添加到运行循环    */    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0                                                   target:self                                                 selector:@selector(updateTimer)                                                 userInfo:nil                                                  repeats:YES];
  • 子线程运行循环

    dispatch_async(dispatch_get_global_queue(0, 0), ^{        // 在子线程开启时钟,由于子线程的运行循环没有启动,所以没法监听时钟事件        self.timer = [NSTimer timerWithTimeInterval:1.0                                              target:self                                            selector:@selector(updateTimer)                                            userInfo:nil                                             repeats:YES];        [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];        // 启动子线程的运行循环,这句代码就是一个死循环!如果不停止运行循环,不会执行后续的任何代码        CFRunLoopRun();        // 停止子线程运行循环之前,不会执行添加到此处的任何代码    });    // 运行循环执行操作方法    - (void)updateTimer {        static int num = 0;        NSLog(@"%d %@", num++, [NSThread currentThread]);        // 满足条件后,停止当前的运行循环        if (num == 8) {            // 一旦停止了运行循环,后续代码能够执行,执行完毕后,线程被自动销毁            CFRunLoopStop(CFRunLoopGetCurrent());        }    }

转载于:https://www.cnblogs.com/QianChia/p/5782964.html

你可能感兴趣的文章
2017-5-16 类
查看>>
loadView的用法
查看>>
5只蚂蚁走木棍问题
查看>>
iOS中3种正则表达式的使用与比较
查看>>
如果是繁體,Zzk搜不搜的到呢?
查看>>
系统设计 - 软件构件技术
查看>>
linux下配置SVN搭建 centos svn安装配置
查看>>
c#高级编程第七版 学习笔记 第一章 .NET体系结构
查看>>
黄聪:如何高效率存储微信中的 access_token
查看>>
HackerRank The Chosen One [预处理][gcd]
查看>>
封装获取连续数字的拼接
查看>>
gdb调试
查看>>
第一周 从C走进C++ 003 位运算
查看>>
k8s第一个实例创建redis集群服务
查看>>
Postgresql 查看建表语句 命令
查看>>
git操作
查看>>
技术文档翻译-------glove readme(1)
查看>>
编码格式
查看>>
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
查看>>
poj 2828【线段树 单点更新】
查看>>