NSRunLoop漫谈

来源:互联网 发布:战龙三国徐晃进阶数据 编辑:程序博客网 时间:2024/06/06 06:16

Runloop是线程相关的基础框架的一部分。一个runloop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。使用runloop的目的是让你的线程在有工作的时候忙于工作,而没有工作的时候处于休眠状态。

runloop事件处理

在runloop中有两类事件需要处理:1定时器 2输入源。

输入源分为3类:

NSPort基于端口的源

Cocoa和 Core Foundation 为使用端口相关的对象和函数创建的基于端口的源提供了内在支持。 Cocoa只需要简单的创建端口对象,而Core Foundation必须人工创建端口和他的runloop源。NSPort一般分三种: NSMessagePort(基本废弃)、NSMachPort、 NSSocketPort。其中NSMachPort用于线程间通信,而NSSocketPort用于网络通信。

自定义的源

必须使用Core Foundation里面的CFRunLoopSourceRef类型相关的函数来创建,同时必须定义消息传递机制。一般我们不会使用该种源,第三种情况已经满足我们的需求。

performselector源

和基于端口的源一样,执行selector请求会在目标线程上序列化,减缓许多在线程上允许多个方法容易引起的同步问题,但是跟基于端口的源不同,一个selector执行完后自动从runloop里面移除。
当在非main thread中perform selector时,其thread中必须有一个激活的run loop。对于你自己创建的thread而言,只有你的代码显式的运行一个run loop后该perform selector才能得到执行。Run loop在当loop运行时处理所有已排队的perform selector,而不是在一个loop循环时只处理某一个perform selector。

定时源

传递同步事件,发生在特定时间内重复的时间间隔。当你创建输入源时,你需要将其分配给runloop中的一个或多个模式。模式只会在特定事件影响监听的源。大多数情况下,runloop运行在默认模式下,但是你也可以使其运行在自定义模式。

RunLoop观察者

可以通过创建CFRunLoopObserverRef对象来检测RunLoop的工作状态,它检测RunLoop的以下几种事件:

  • Run loop入口
  • Run loop将要开始定时
  • Run loop将要处理输入源
  • Run loop将要休眠
  • Run loop被唤醒但又在执行唤醒事件前
  • Run loop终止

RunLoop Mode

runloop mode是一个集合,包括监听:事件源,定时器,以及需通知的runloop observers。
- default模式:几乎包括所有输入源(除NSConnection)
- modal模式:处理modal panels
- connection模式:处理NSConnection事件,属于系统内部,用户基本不用
- event tracking模式:如组件拖动输入源
- UITrackingRunLoopModes 不处理定时事件
- common modes模式:NSRunLoopCommonModes 这是一组可配置的通用模式。将input
sources与该模式关联则同时也将input sources与该组中的其它模式进行了关联。

Run Loop使用情况

仅当在为你的程序创建辅助线程的时候,你才需要显式运行一个runloop。例如以下4点
- 使用ports 或 input sources 和其他线程通信;
- 在线程中使用timers。如果不启动run loop,timer的事件是不会响应的;
- 在Cocoa 应用中使用performSelector…方法,应该是performSelector…这种方法会启动一个线程并启动run loop吧;
- 让线程执行一个周期性的任务。如果不启动run loop, 线程跑完就可能被系统释放了

注:timer的创建和释放必须在同一线程中。
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
此方法会retain timer对象的引用计数。

Runloop的底层实现

苹果官方将系统分为4个层次。 1应用层(用户能接触到的图形应用)2应用框架层(开发人员接触的cocoa等框架)3核心框架层(各种核心框架,OPENGL等)4darwin(操作系统的核心,包含系统内核,驱动,shell等)。
其中硬件层包含3个部分:MACH、BSD、IOKit 共同组成xnu内核。mach是内环,提供了处理器调度,ipc(进程间通信)等非常少量的基础服务。bsd是外环,提供了诸如进程管理、文件系统和网络等功能。iokit为设备驱动提供一个面向对象的c++的一个框架。mach中所有的东西都是通过自己的对象实现的,进程,线程和虚拟内存都被称为“对象”。mach中的对象不能直接调用,只能通过消息传递的方式实现对象间的通信。“消息”是mach中最基础的概念,消息在两个端口之间传递,这就是mach的ipc的核心。runloop的核心就是一个mach_msg(),runloop调用这个函数去接收消息。如果别人没有发送port过来,内核会将线程置于等待状态。为了实现消息的发送和接收,mach_msg()函数实 际上是调用了mach_msg_trap(),也就是系统调用。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 平安eq测试没过怎么办 物业在小区私自建房怎么办 婚后父母出钱买房离婚怎么办 情人忙工作没时间约会怎么办 情人很忙不主动联系我怎么办 丈夫毫不关心基督徒妻子怎么办 眼睛太小怎么办不整容 被野生猴子咬了怎么办 被野猴子抓伤了怎么办 孩子入学前疫苗补不全怎么办 额头肤色比脸黑怎么办 高跟鞋小了挤脚怎么办 老板欠工人工资不给怎么办 小孩吃了生豆子怎么办 拍夜晚的天空太亮怎么办 购房发票字体不清晰怎么办 接到客人电话预定时怎么办 产检资料弄丢了怎么办 工作中同事喜欢争风头怎么办 想出卖身体赚钱了怎么办 孩子生下来不想要了怎么办 舌头被铁管冻住怎么办 人被水泥冻住了怎么办 姑娘果孕妇吃了怎么办 纹身后吃了辣的怎么办 怀孕五个多月不想要了怎么办 失业后又干保安档案怎么办 前列大腺脓肿要怎么办 小动物死了孩子很伤心怎么办 向客人开错房间怎么办 工伤认定没有证人证言怎么办? 一个月没来月经怎么办14岁 刮了胡子下巴痒怎么办 月经多怎么办喝什么好 大姨妈不调怎么办来了 多人被骗没证据怎么办 一直坏肚子拉水怎么办 犯人在监狱有高危高血压怎么办 丈夫出轨他死都不承认怎么办 没写欠条的债该怎么办 被尾随回家知道住处怎么办