1、RunLoop

  • 1)运行循环:

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

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

    • 作用:

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

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

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

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

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

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

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());}}

iOS - OC RunLoop 运行循环/消息循环相关推荐

  1. IOS的pch文件,NSTimer定时器,运行消息循环,随机色使用

    IOS的pch文件,NSTimer定时器,运行消息循环,随机颜色获取使用 xcode新创建一个项目命名pchTest 右键创建文件,选择other 下面的pch,名字不要管默认就好 选中项目 : Bu ...

  2. Runloop - 运行循环

    参考文章 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopMa ...

  3. android 结束if循环_Android Handler 消息循环机制

    前言 一问起Android应用程序的入口,很多人会说是Activity中的onCreate方法,也有人说是ActivityThread中的静态main方法.因为Java虚拟机在运行的时候会自动加载指定 ...

  4. ijkplayer 消息循环处理过程分析

    ijkplayer 消息循环处理过程分析 简介 一.消息队列初始化 1. initWithContentURLString函数 2. ijkmp_ios_create函数 3. ijkmp_creat ...

  5. Windows 消息循环(1) - 概览

    本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...

  6. 异步IO(协程,消息循环队列)

    同步是CPU自己主动查看IO操作是否完成,异步是IO操作完成后发出信号通知CPU(CPU是被通知的) 阻塞与非阻塞的区别在于发起IO操作之后,CPU是等待IO操作完成再进行下一步操作,还是不等待去做其 ...

  7. android 消息循环机制--looper handler

    Looper类说明   Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结 ...

  8. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...

  9. TApplication与主消息循环

    Windows应用程序的每一个窗口都有一个大的消息循环以及一个窗口函数(WndProc)用以分发和处理消息.VCL作为一个Framework,当然会将这些东西隐藏起来,而重新提供一种易用的.易理解的虚 ...

最新文章

  1. 《转》十种更好的表达“你的代码写的很烂”的方法
  2. ppt 简单动画制作
  3. git中Please enter a commit message to explain why this merge is necessary.
  4. android dimensions.xml,android – Value等于match_parent或fill_parent在dimensions.xml?
  5. 剑指Offer-正则表达式匹配(Python)
  6. java 语法_Java基础语法
  7. mysql 钩子_面试官: 什么是 Hook (钩子) 线程以及应用场景?
  8. 训练日志 2019.1.13
  9. java 线程死锁简单例子_java 多线程死锁详解及简单实例
  10. 使用base64 对Json 的返回数据进行优化
  11. STM32L5特性简介 Cortex-M33内核TEE-TrustZone信息安全
  12. 数学实验4:Matlab作图实验
  13. 0-博客笔记导读目录(全部)-20220506backup
  14. [opencv4]——fatal error: opencv2/opencv.hpp: No such file or directory #include <opencv2/opencv.hpp>
  15. php 不支持ereg,PHP: ereg 、 eregi 函式的替代方案
  16. 区块链游戏企鹅大陆上线10000创始限时开放注册
  17. AngularJs:Directive指令用法
  18. ORA-01000-超出打开游标的最大数(解决及原因)
  19. ctfshow 做题 萌新 模块(1)
  20. SAP导入或更新某网证证书

热门文章

  1. delphi2010完美破解方法
  2. 关于使用类成员函数作为回调的方法
  3. 测试人员的系统性思维
  4. xml引入约束示例(xsd文件)
  5. 03-24 CPU 统计
  6. eplan备份时卡顿_EPLAN卡顿了怎么办?
  7. 北理工计算机 应用基础在线作业,16秋北理工《计算机应用基础》在线作业
  8. db文件 linux查看工具,Linux最大文件句柄数查看及修改
  9. java mysql proxy_Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目...
  10. mysql要将语句反复执行15次_MySQL多表查询疑问