iOS - OC RunLoop 运行循环/消息循环
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 运行循环/消息循环相关推荐
- IOS的pch文件,NSTimer定时器,运行消息循环,随机色使用
IOS的pch文件,NSTimer定时器,运行消息循环,随机颜色获取使用 xcode新创建一个项目命名pchTest 右键创建文件,选择other 下面的pch,名字不要管默认就好 选中项目 : Bu ...
- Runloop - 运行循环
参考文章 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopMa ...
- android 结束if循环_Android Handler 消息循环机制
前言 一问起Android应用程序的入口,很多人会说是Activity中的onCreate方法,也有人说是ActivityThread中的静态main方法.因为Java虚拟机在运行的时候会自动加载指定 ...
- ijkplayer 消息循环处理过程分析
ijkplayer 消息循环处理过程分析 简介 一.消息队列初始化 1. initWithContentURLString函数 2. ijkmp_ios_create函数 3. ijkmp_creat ...
- Windows 消息循环(1) - 概览
本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...
- 异步IO(协程,消息循环队列)
同步是CPU自己主动查看IO操作是否完成,异步是IO操作完成后发出信号通知CPU(CPU是被通知的) 阻塞与非阻塞的区别在于发起IO操作之后,CPU是等待IO操作完成再进行下一步操作,还是不等待去做其 ...
- android 消息循环机制--looper handler
Looper类说明 Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结 ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...
- TApplication与主消息循环
Windows应用程序的每一个窗口都有一个大的消息循环以及一个窗口函数(WndProc)用以分发和处理消息.VCL作为一个Framework,当然会将这些东西隐藏起来,而重新提供一种易用的.易理解的虚 ...
最新文章
- 《转》十种更好的表达“你的代码写的很烂”的方法
- ppt 简单动画制作
- git中Please enter a commit message to explain why this merge is necessary.
- android dimensions.xml,android – Value等于match_parent或fill_parent在dimensions.xml?
- 剑指Offer-正则表达式匹配(Python)
- java 语法_Java基础语法
- mysql 钩子_面试官: 什么是 Hook (钩子) 线程以及应用场景?
- 训练日志 2019.1.13
- java 线程死锁简单例子_java 多线程死锁详解及简单实例
- 使用base64 对Json 的返回数据进行优化
- STM32L5特性简介 Cortex-M33内核TEE-TrustZone信息安全
- 数学实验4:Matlab作图实验
- 0-博客笔记导读目录(全部)-20220506backup
- [opencv4]——fatal error: opencv2/opencv.hpp: No such file or directory #include <opencv2/opencv.hpp>
- php 不支持ereg,PHP: ereg 、 eregi 函式的替代方案
- 区块链游戏企鹅大陆上线10000创始限时开放注册
- AngularJs:Directive指令用法
- ORA-01000-超出打开游标的最大数(解决及原因)
- ctfshow 做题 萌新 模块(1)
- SAP导入或更新某网证证书
热门文章
- delphi2010完美破解方法
- 关于使用类成员函数作为回调的方法
- 测试人员的系统性思维
- xml引入约束示例(xsd文件)
- 03-24 CPU 统计
- eplan备份时卡顿_EPLAN卡顿了怎么办?
- 北理工计算机 应用基础在线作业,16秋北理工《计算机应用基础》在线作业
- db文件 linux查看工具,Linux最大文件句柄数查看及修改
- java mysql proxy_Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目...
- mysql要将语句反复执行15次_MySQL多表查询疑问