目标:用简洁易懂的语言归纳runLoop和对我们日常开发的影响。

1. 什么是RunLoop

runLoop是一个与线程相关的机制,可以简单理解为一个循环。 在这个循环里面等待事件,然后处理事件。而这个循环是基于线程的。 在Cocoa中每个线程都有它的runLoop. 通过runLoop这样的机制,线程能够在没有事件需要处理的时候休息,有事情的时候运行。减轻CPU压力。

2. 日常开发中的RunLoop

简单理解了RunLoop之后,我们发现其实我们平时的开发,背后都无时无刻与runLoop有关。

但是我们很幸运不需要把时间都浪费在纠结这些底层细节上,绝大部分工作都交给了操作系统为我们实现。 所以关于runLoop,我们在不想被底层细节包围的前提下,需要了解和做些什么呢。

  1. 需要了解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。

  2. 解决方案:

    • 第一种:设置RunLoop Mode,例如NSTimer,我们指定它运行于NSRunLoopCommonModes,这是一个Mode的集合。注册到这个Mode下后,无论当前runLoop运行哪个mode,事件都能得到执行。
    • 第二种:另一种解决Timer的方法是,我们在另外一个线程执行和处理Timer事件,然后在主线程更新UI.

转载于:https://www.cnblogs.com/iamjjh/p/4815482.html

iOS夯实:RunLoop相关推荐

  1. iOS夯实:内存管理

    最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 基本信息 Objective-C 提供了两种内存管理方式. MRR (manual reta ...

  2. 【iOS】—— RunLoop线程常驻和线程保活

    文章目录 没有线程常驻会怎么样? 线程常驻 线程保活 没有线程常驻会怎么样? 我们一般写一个子线程,子线程执行完分配的任务后就会自动销毁,比如下面这个情况: 我们先重写一下NSThread里面的dea ...

  3. iOS关于RunLoop和Timer

    转自:http://www.cnblogs.com/vicstudio/p/3281682.html RunLoop这个东西,其实我们一直在用,但一直没有很好地理解它,或者甚至没有知道它的存在.Run ...

  4. iOS - OC RunLoop 运行循环/消息循环

    1.RunLoop 1)运行循环: 运行循环在 iOS 开发中几乎不用,但是概念的理解却非常重要. 同一个方法中的代码一般都在同一个运行循环中执行,运行循环监听 UI 界面的修改事件,待本次运行循环结 ...

  5. 【iOS】—— RunLoop详解

    目录 一.Runloop概述 Runloop基本作用 Runloop伪代码 Runloop模型图 二.Runloop对象 Runloop对象的获取 _CFRunLoopGet0方法 Runloop与线 ...

  6. iOS Autorelease Runloop

    学习Iphone开发,Autorelease的何时释放一直是困扰我的一个问题,总觉得大部分文档提到的延迟释放,但是这个延迟感念非常模糊,5s叫延迟还是5min叫延迟?所以总觉得担心我用到标明Autor ...

  7. iOS开发-Runloop探索

    文章目录 Runloop 源码分析 创建 对外接口 事件循环 何时需要启动Runloop 处理事件 如何创建Runloop Observer 启用Runloop的方式 退出Runloop的方式 与线程 ...

  8. IOS 多线程 RUNLOOP 机制 (二)

    二,何时使用Run Loop 对于辅助线程,在需要和线程有更多交互时,才使用Run Loop. 比如:1)使用端口或者自定义输入源来和其他线程通讯 2)使用线程定时器 3)Cocoa中使用任何perf ...

  9. iOS的GCD、NSThread、NSOperation、锁、Runloop的介绍和使用

    GCD GCD (Grand Central Dispatch) GCD两个核心概念:任务和队列 任务 任务就是执行操作的意思,也就是block那段代码.执行操作有两种:同步执行和异步执行. 同步执行 ...

最新文章

  1. GDB 格式化结构体输出
  2. ElasticSearch2.4.6的安装部署以及集群部署、ElasticSearch-head等插件的安装
  3. 【华为大咖分享】8.Focus on Value 的思考与实践精粹(后附PPT下载地址)
  4. Python 神经网络是这样识别手写字符哒?
  5. C# 串口操作系列(4) -- 协议篇,文本协议数据解析 .
  6. Qt、GTK 和KDE、GNOME的关系-转
  7. 在Android中自定义捕获Application全局异常,可以替换掉系统的强制退出对话框(很有参考价值与实用价值)
  8. 解决Mac按列浏览图加载慢的问题
  9. python编程基础之六
  10. Java动态修改注解的属性值
  11. 大厂面试题之计算机网络重点篇 (附答案)
  12. 解决django admin表的外键关联数据过多响应时间过长问题
  13. Banner框架实现图片轮播
  14. 华为交换机初始化_我想问华为 s5700交换机 1。请问怎么恢复出厂设置? 2。如果没有密码又怎么恢复出厂设置? 谢谢了...
  15. win10编译 Fast R-CNN 所需的setup.py(rotate) tensorflow版
  16. firefoxos gaia 开发环境
  17. 企鹅号转正后是2级账号还有用吗,企鹅号不被系统推荐怎么办
  18. 【Python网络编程】爬取百度贴吧、小说内容、豆瓣小说、Ajax爬微博、多线程爬淘宝
  19. group by后乱序问题原因和解决
  20. 如何测算BMI指数(Python)

热门文章

  1. Esfog_UnityShader教程_漫反射DiffuseReflection
  2. 共享一个对Reflector 反编译支持中文的修正FileGenerator文件
  3. SpringBoot配置属性之DataSource
  4. 以服务的方式提供站点基础功能支持
  5. Delphi XE 10.2.3使用CEF4Delphi取网页元素时碰到nbsp;变问号?的处理
  6. 南邮CTF密码学write up
  7. JS事件冒泡机制和兼容性添加事件
  8. WebForm 【上传图片--添加水印】
  9. 五个项目管理学习笔记.沟通技巧II
  10. NSS_06 extjs弹出窗口上的文本框默认获得焦点