美文网首页
多线程之RunLoop

多线程之RunLoop

作者: 锦瑟流年终成忆 | 来源:发表于2016-07-18 16:29 被阅读10次

什么是RunLoop

从字面意思看       运行循环         跑圈

基本作用

1.保持程序的持续运行

2.处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)

3.节省CPU资源,提高程序性能:该做事时做事,该休息时休息

如果没有RunLoop

没有RunLoop的情况下    第3行后程序就结束了

如果有了RunLoop

有RunLoop的情况下 由于main函数里面启动了个RunLoop,所以程序并不会马上退出,保持持续运行状态

main函数中的RunLoop

第14行代码的UIApplicationMain函数内部就启动了一个RunLoop 所以UIApplicationMain函数一直没有返回,保持了程序的持续运行 这个默认启动的RunLoop是跟主线程相关联的

RunLoop对象

iOS中有2套API来访问和使用RunLoop

1.Foundation     NSRunLoop

2.CoreFoundation

CFRunLoopRef

NSRunLoop和CFRunLoopRef都代表着RunLoop对象

NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(CoreFoundation层面)

RunLoop资料

1.苹果官方文档

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

2.CFRunLoopRef是开源的

http://opensource.apple.com/source/CF/CF-1151.16/

RunLoop与线程

1.每条线程都有一个唯一的与之对应的RunLoop对象

2.主线程的RunLoop对象已经创建好了,子线程的RunLoop对象需要主动创建

3.RunLoop在第一次获取时创建,在线程结束时销毁

获取RunLoop对象

Foundation

[NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象

[NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象

CoreFoundation

CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象

CFRunLoopGetMain();  // 获得主线程的RunLoop对象

RunLoop相关类

CoreFoundation中关于RunLoop的5个类

CFRunLoopRef   CFRunLoopModeRef   CFRunLoopSourceRef    CFRunLoopTimerRef

CFRunLoopObserverRef

CFRunLoopModeRef

CFRunLoopModeRef代表RunLoop的运行模式

1.一个RunLoop包含若干个Mode,每个Mode又包含若干个Source/Timer/Observer

2.每次RunLoop启动时,只能指定其中一个Mode,这个Mode被称作CurrentMode

3.如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入

4.这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响

系统默认注册了5个Mode:

1.kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行

2.UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响

3.UIInitializationRunLoopMode:在刚启动App时第进入的第一个Mode,启动完成后就不再使用

4.GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常用不到

5.kCFRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode

CFRunLoopSourceRef

CFRunLoopSourceRef是事件源(输入源)

以前的分法

Port-Based Sources

Custom Input Sources

Cocoa Perform Selector Sources

现在的分法

Source0:非基于Port的

Source1:基于Port的

CFRunLoopTimerRef

CFRunLoopTimerRef是基于时间的触发器

基本上说的就是NSTimer

CFRunLoopObserverRef

CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变

可以监听的时间点有以下几个

RunLoop处理逻辑-官方版

RunLoop处理逻辑-网友整理版


RunLoop应用

1.NSTimer  2.ImageView显示 3.PerformSelector 4.常驻线程   5.自动释放池

相关文章

  • GeekBand - iOS 多线程和RunLoop 总结

    iOS 开发高级进阶 第三周 多线程 Runloop iOS 多线程以及 RunLoop 学习总结 基础知识 什么...

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

    本文用来介绍 iOS 多线程中,RunLoop 的相关知识。主要包括如下内容:RunLoop 简介RunLoop ...

  • RunLoop的使用

    RunLoop是什么? 它有什么作用?Runloop和多线程又是什么关系?timer 与 Runloop 有什么关...

  • RunLoop初探,满足项目的基本应用

    iOS开发肯定离不开多线程编程,而多线程又跟RunLoop有着密切的关系,这篇文章就来解剖下RunLoop。 每个...

  • ios面试题

    runtime介绍 runLoop与多线程关系 多线程原理(GCD、NSOperation) AFNetworki...

  • RunLoop

    iOS刨根问底-深入理解RunLoop runloop 和线程有什么关系 iOS 多线程:RunLoop详细总结

  • RunLoop其实没有我们想的那么难

    目录一、纯纯的RunLoop(上小菜)二、RunLoop与多线程相结合使用(上大菜) 一、纯纯的RunLoop(上...

  • RunLoop

    1.Runloop基础知识 (RunLoop可以理解为就是为多线程而存在的) 1.1 RunLoop基本概念:运行...

  • RunLoop

    概念 数据结构 事件循环机制 RunLoop 与 NSTimer RunLoop 与多线程 一、概念 RunLoo...

  • 多线程网络总结/runloop图解

    1.多线程总结图: 2.runloop图解:

网友评论

      本文标题:多线程之RunLoop

      本文链接:https://www.haomeiwen.com/subject/hvnpjttx.html