iOS夯实:RunLoop
目标:用简洁易懂的语言归纳runLoop和对我们日常开发的影响。
1. 什么是RunLoop
runLoop是一个与线程相关的机制,可以简单理解为一个循环。 在这个循环里面等待事件,然后处理事件。而这个循环是基于线程的。 在Cocoa中每个线程都有它的runLoop. 通过runLoop这样的机制,线程能够在没有事件需要处理的时候休息,有事情的时候运行。减轻CPU压力。
2. 日常开发中的RunLoop
简单理解了RunLoop之后,我们发现其实我们平时的开发,背后都无时无刻与runLoop有关。
但是我们很幸运不需要把时间都浪费在纠结这些底层细节上,绝大部分工作都交给了操作系统为我们实现。 所以关于runLoop,我们在不想被底层细节包围的前提下,需要了解和做些什么呢。
需要了解RunLoop的坑:
NSTimer
日常开发中,我们与runLoop接触得最近可能就是通过NSTimer了。一个Timer一次只能加入到一个RunLoop中。我们日常使用的时候,通常就是加入到当前的runLoop的default mode中。提到mode,就需要谈谈RunLoop Modes
简单的说,runLoop有多个Mode,RunLoop只能运行一个Mode,runLoop只会处理它当前Mode的事件。所以就会导致一些地方我们需要去注意。
- 一般Timer是运行在RunLoop的default mode上,而ScrollView在用户滑动时,主线程RunLoop会转到UITrackingRunLoopMode。而这个时候,Timer就不会运行,方法得不到fire。
用一个真实例子来说明(自身教训):
在一次写一个注册界面的时候,用户点击发送验证码后,使用Timer,倒数60秒以允许用户再次申请发送验证码,同时每一秒更新界面秒数信息。而此时Timer运行于主线程的default mode上。若此时用户滑动显示屏,则会出现Timer失效,界面得不到更新的情况。此时就是因为RunLoop的mode原因。
NSURLConnection,NSStream也是同样的情况,默认运行于default mode。
解决方案:
- 第一种:设置RunLoop Mode,例如NSTimer,我们指定它运行于NSRunLoopCommonModes,这是一个Mode的集合。注册到这个Mode下后,无论当前runLoop运行哪个mode,事件都能得到执行。
- 第二种:另一种解决Timer的方法是,我们在另外一个线程执行和处理Timer事件,然后在主线程更新UI.
转载于:https://www.cnblogs.com/iamjjh/p/4815482.html
iOS夯实:RunLoop相关推荐
- iOS夯实:内存管理
最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 基本信息 Objective-C 提供了两种内存管理方式. MRR (manual reta ...
- 【iOS】—— RunLoop线程常驻和线程保活
文章目录 没有线程常驻会怎么样? 线程常驻 线程保活 没有线程常驻会怎么样? 我们一般写一个子线程,子线程执行完分配的任务后就会自动销毁,比如下面这个情况: 我们先重写一下NSThread里面的dea ...
- iOS关于RunLoop和Timer
转自:http://www.cnblogs.com/vicstudio/p/3281682.html RunLoop这个东西,其实我们一直在用,但一直没有很好地理解它,或者甚至没有知道它的存在.Run ...
- iOS - OC RunLoop 运行循环/消息循环
1.RunLoop 1)运行循环: 运行循环在 iOS 开发中几乎不用,但是概念的理解却非常重要. 同一个方法中的代码一般都在同一个运行循环中执行,运行循环监听 UI 界面的修改事件,待本次运行循环结 ...
- 【iOS】—— RunLoop详解
目录 一.Runloop概述 Runloop基本作用 Runloop伪代码 Runloop模型图 二.Runloop对象 Runloop对象的获取 _CFRunLoopGet0方法 Runloop与线 ...
- iOS Autorelease Runloop
学习Iphone开发,Autorelease的何时释放一直是困扰我的一个问题,总觉得大部分文档提到的延迟释放,但是这个延迟感念非常模糊,5s叫延迟还是5min叫延迟?所以总觉得担心我用到标明Autor ...
- iOS开发-Runloop探索
文章目录 Runloop 源码分析 创建 对外接口 事件循环 何时需要启动Runloop 处理事件 如何创建Runloop Observer 启用Runloop的方式 退出Runloop的方式 与线程 ...
- IOS 多线程 RUNLOOP 机制 (二)
二,何时使用Run Loop 对于辅助线程,在需要和线程有更多交互时,才使用Run Loop. 比如:1)使用端口或者自定义输入源来和其他线程通讯 2)使用线程定时器 3)Cocoa中使用任何perf ...
- iOS的GCD、NSThread、NSOperation、锁、Runloop的介绍和使用
GCD GCD (Grand Central Dispatch) GCD两个核心概念:任务和队列 任务 任务就是执行操作的意思,也就是block那段代码.执行操作有两种:同步执行和异步执行. 同步执行 ...
最新文章
- GDB 格式化结构体输出
- ElasticSearch2.4.6的安装部署以及集群部署、ElasticSearch-head等插件的安装
- 【华为大咖分享】8.Focus on Value 的思考与实践精粹(后附PPT下载地址)
- Python 神经网络是这样识别手写字符哒?
- C# 串口操作系列(4) -- 协议篇,文本协议数据解析 .
- Qt、GTK 和KDE、GNOME的关系-转
- 在Android中自定义捕获Application全局异常,可以替换掉系统的强制退出对话框(很有参考价值与实用价值)
- 解决Mac按列浏览图加载慢的问题
- python编程基础之六
- Java动态修改注解的属性值
- 大厂面试题之计算机网络重点篇 (附答案)
- 解决django admin表的外键关联数据过多响应时间过长问题
- Banner框架实现图片轮播
- 华为交换机初始化_我想问华为 s5700交换机 1。请问怎么恢复出厂设置? 2。如果没有密码又怎么恢复出厂设置? 谢谢了...
- win10编译 Fast R-CNN 所需的setup.py(rotate) tensorflow版
- firefoxos gaia 开发环境
- 企鹅号转正后是2级账号还有用吗,企鹅号不被系统推荐怎么办
- 【Python网络编程】爬取百度贴吧、小说内容、豆瓣小说、Ajax爬微博、多线程爬淘宝
- group by后乱序问题原因和解决
- 如何测算BMI指数(Python)
热门文章
- Esfog_UnityShader教程_漫反射DiffuseReflection
- 共享一个对Reflector 反编译支持中文的修正FileGenerator文件
- SpringBoot配置属性之DataSource
- 以服务的方式提供站点基础功能支持
- Delphi XE 10.2.3使用CEF4Delphi取网页元素时碰到nbsp;变问号?的处理
- 南邮CTF密码学write up
- JS事件冒泡机制和兼容性添加事件
- WebForm 【上传图片--添加水印】
- 五个项目管理学习笔记.沟通技巧II
- NSS_06 extjs弹出窗口上的文本框默认获得焦点