1.RunLoop的概念及作用 2.RunLoop的使用 3.RunLoop的相关类 4.RunLoop的工作原理 5.小结 6.思考

什么是RunLoop? 从字面意思上是一直循环跑,事实上就是一个循环的概念。一般的应用程序在退出之前都一直处于响应时间的状态,即事件循环结构。

RunLoop基本的循环模式 1.开始循环 2.程序处于睡眠状态,等待接受事件 3.事件传入,程序被唤醒,获取事件 4.处理事件 5.进入下一次循环

RunLoop的作用 1.使程序一直运行,并且接受用户的输入 2.决定程序在何时应该处理那些event 3.调用解耦和 4.节省CPU时间

RunLoop的使用 一.获取 +(NSRunLoop) currentRunLoop;//获取当前进程的RunLoop +(NSRunLoop)mainRunLoop;//获取主线程的RunLoop

CFRunLoopRef CFRunLoopGetCurrent(void);//获取当前进程的RunLoop CFRunLoopRef CGRunLoopGetMain(void);//获取主线程的RunLoop

二.启动 -(void)run; -(void)runUntilDate:(NSDate)limitDate; -(bool)runMode:(NSString)mode beforeDate:(NSDate*)limitDate;

三.运行模式 NSString *const NSDefaultRunLoopMode; NSRunLoopCommonModes NS_AVAIABLE(10_5,2_0);

四.停止 CFRunLoopStop(CFRunLoopGetCurrent());//停止当前的运行的RunLoop [thread cancel];//关闭线程 RunLoop的相关类 CFRunLoopRef

CFRunLoopModeRef: 称为RunLoop模式,或者叫事件的执行模式,是所有要检测的输入源和定时源以及要通知的RunLoop注册观察者的集合,用来制定事件在运行循环中的优先级。 每次调用RunLoop的主函数,只能指定其中一个Mode,即RunLoop在同一时间内,必须且只能设定一种模式,这种Mode被称为currentMode。 如果需要切换Mode必须退出loop,然后重新指定一个mode进入,重启Loop。 NSDefaultRunLoopMode,默认模式,空闲状态,。UITractingRunLoopMode用来追踪运动事件模式。 NSRunLoopCommonModes是一个模式集合,默认包括上面两种模式。

CFRunLoopSourceRef 是RunLoop输入源抽象类,针对的是输入源方式的Loop。 source有两个版本:source0 和 source1 source0:主要处理APP内部事件,APP自己负责管理,如UIEvent,CFSocket。对应的数据结构:

CFRunLoopSourceContext。 source1:被用于通过内核和其他线程互发消息。由内核和RunLoop管理,Mach port驱动,如CFMachPort,CFMessagePort。对应的结构体:CFRunLoopSourceContext1 CFRunLoopTimerRef 是RunLoop的时间源,NSTimer就是用RunLoopTimer封装的,同样的还有CADisplayLink,还有我们平时用的延时调用方法performSelector:afterDelay:

CFRunLoopObserverRef 负责监听RunLoop运行状态,会在相应事件发生前传递消息,所以通知的时间和事件实际发生的时间有误差。主要有以下几个时间点

调用堆栈 程序从运行开始到当前的函数之间,所有调用过的函数的前后顺序。 [NSThread callStackSymbols];

RunLoop工作原理 核心是如何实现事件的挂起和唤醒。

RunLoop挂起和唤醒的基本逻辑 1.指定用于唤醒的mach_port 端口 2.调用mach_msg监听唤醒端口,系统内核将这个线程挂起,停留在mach_msg_trap状态 3.当其他线程(或其他进程的某个线程)向内核发送这个端口的msg后,trap状态被唤醒,RunLoop继续开始运行

RunLoop的事件处理 1.基于端口的输入源(Port Sources) 2.自定义输入源(Custom Sources) 3.Cocoa执行Selector的源(“performSelector方法” Sources) 4.定时源(Timer Sources)

在启动RunLoop之前,必须添加监听的输入源事件或者定时源事件,否则调用[RunLoop run]会直接返回,而不会进入循环让线程长驻。如果没有添加任何输入源事件或者Timer事件,线程会一直在无限循环空转中,会一直占用CPU事件片,没有实现资源的合理分配,没有while循环且没有添加任何输入源或Timer线程,线程会直接完成,被系统回收。

RunLoop的执行顺序 1.通知观察者RunLoop已经启动 2.通知观察者任何要即将要开始的定时器 3.通知观察者任何即将启动的非基于端口的源 4.启动任何准备好的非基于端口的源 5.如果基于端口的源准备好并处于等待状态,立即启动,并进入步骤九 6.通知观察者线程进入休眠 7.将线程置于休眠直到以下任一事件发生: 某一事件到达基于端口的源 定时器启动 Run loop设置的时间已经超时 Run loop被显式唤醒 8.通知观察者线程将被唤醒 9.处理未处理的事件 如果用户定义的定时器启动,处理定时器事件并重启runloop,进入步骤二 如果输入源启动,传递相应的消息 如果runloop被显式唤醒而且时间还没有被超时,重启runloop,进入步骤二 10.通知观察者,runloop结束

小结 runloop是iOS系统对事件接受和分发机制的一个实现,是线程的基本架构部分。一个runloop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。 使用runloop的目的是使你的线程在有工作的时候工作,没有的时候休眠,以达到节省cpu的目的。runloop的管理并不完全是自动,当我们创建一个子线程时,我们必须在适当的时候启动Runloop并正确响应事件。 子线程不需要显式的创建RunLoop,每个线程,包括程序的主线程都有与之对应的RunLoop对象,但是自己创建的线程需要手动运行RunLoop的运行方法。不过程序启动时,主线程会自动创建并运行RunLoop。

思考

1.RunLoop和URLconnetion有什么关系 URLconnetion的作用是负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据。而runloop得作用是主线程默认有Runloop。当自己启动一个线程,如果只是用于处理单一的事件,则该线程在执行完之后就退出了。所以当我们需要让该线程监听某项事务 时,就得让线程一直不退出,runloop就是这么一个循环,没有事件的时候,一直卡着,有事件来临了,执行其对应的函数。所以当connetion发送请求后,此时需要等待服务器端的反馈,这就需要runloop来进行管理,当服务器端一直没有反馈,就需要一直卡着,等到服务器的反馈,然后connetion才能执行下一步操作,直到操作结束。

2.不手动指定autoreleasepool的前提下,一个Autorealese对象在什么时候释放 在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop

3.以+ sheduledTimerWithTimeInterval的方式触发的timer,在滑动页面上的列表时,timer会暂时回调,为什么,如何解决 RunLoop只能运行在一种mode下,如果要换mode,当前的loop也需要停下重启成新的。利用这个机制,ScrollView滚动过程中NSDefaultRunLoopMode的mode会切换到UITrackingRunLoopMode来保证ScrollView的流畅滑动:只能在NSDefaultRunLoopMode模式下处理的事件会影响ScrollView的滑动。

如果我们把一个NSTimer对象以NSDefaultRunLoopMode添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度。 同时因为mode还是可定制的,所以: Timer计时会被scrollView的滑动影响的问题可以通过将timer添加到NSRunLoopCommonModes来解决。

多线程(RunLoop)的更多相关文章

  1. iOS多线程-RunLoop简介

    什么是RunLoop? 从字面上来看是运行循环的意思. 内部就是一个do{}while循环,在这个循环里内部不断的处理各种任务(比如:source/timer/Observer) RunLoop的存在 ...

  2. 笔谈runloop(一)

    关于runloop熟悉而又陌生,熟悉的是在iOS开发的过程中线程的执行就跟runloop扯上关系了,陌生的是runloop到底是个什么东西.去公司面试的时候,很多公司的面试人员会问这个问题.runlo ...

  3. iOS----------学习路线思维导图

    UI相关 Runtime OC特性 内存管理 Block 多线程 Runloop 网络相关 设计模式 架构 算法 第三方库

  4. iOS中多线程原理与runloop介绍

    一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...

  5. iOS 多线程:『RunLoop』详尽总结

    1. RunLoop 简介 1.1 什么是 RunLoop? 可以理解为字面意思:Run 表示运行,Loop 表示循环.结合在一起就是运行的循环的意思.哈哈,我更愿意翻译为『跑圈』.直观理解就像是不停 ...

  6. ios多线程原理及runloop介绍

    一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...

  7. 多线程与RunLoop

    iOS开发中的多线程 一个iOS程序,默认开启1条线程--主线程orUI线程 主线程主要作用:         显示/刷新UI界面         处理UI事件(点击.滚动.拖拽事件等) 主线程使用注 ...

  8. iOS开发——多线程篇——RunLoop

    一.简介 1.什么是RunLoop从字面意思看运行循环跑圈 基本作用保持程序的持续运行处理App中的各种事件(比如触摸事件.定时器事件.Selector事件)节省CPU资源,提高程序性能:该做事时做事 ...

  9. Runloop, 多线程

    Runloop是个死循环,为甚么? 1. 保证程序不退出 2.监听用户的事件, 触摸,时钟,网络事件 UITrackingMode,只能触摸事件,没有触摸事件了,直接就停止了 Runloop: sou ...

随机推荐

  1. 详解 mpls vpn 的实现

    MPLS VPN的实现 一.实验目的 该实验通过MPLS VPN的数据配置,使学生掌握路由器相关接口的IP地址设置.路由协议的配置以及MPLS VPN的完整的创建过程, 从而加深对IP网络的IP编址. ...

  2. 团队作业4——第一次项目冲刺(Alpha版本)第六天and第七天

    团队作业4--第一次项目冲刺(Alpha版本)第六天and第七天 第一次项目冲刺(Alpha版本)第六天 一.Daily Scrum Meeting照片   二.燃尽图 1.解释说明横纵坐标代表的含义 ...

  3. 201521123045 《Java程序设计》第5周学习总结

    第5周-继承.多态.抽象类与接口 1. 本周学习总结 2. 书面作业 Q1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试 ...

  4. 201521123071《java程序设计》第三周学习总结

    1. 本周学习总结 这周主要学习了构造函数,类与对象,就是这周事情很多,还没来得及好好复习,所以有很多知识都没有认识透彻.但我会尽力补上的. http://images2015.cnblogs.com ...

  5. 201521123028 《Java程序设计》第2周学习总结

    1. 本周学习总结 1.学习了String及部分函数用法,例如PTA上<5-2 jmu-Java-02基本语法-02-StringBuilder>一题中用到了"str.appen ...

  6. Emacs操作指南

  7. 201521123077 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容 总的来说主要有三种类 InputStream/OutputStream(字节流操作类的父类) 提供对字节 ...

  8. Java课程设计-随机密码生成器

    1.团队课程设计博客链接 团队课程设计博客地址 2.个人负责模板 随即密码生成器算法 3.自己的代码提交记录截图 4.自己负责模块或任务详细说明 负责随机密码算法设计实现 通过不同种类选择下生成密码, ...

  9. 201521123062 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  10. 201521123012 《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1. ...