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(),也就是系统调用。
- NSRunLoop漫谈
- NSRunLoop
- nsrunloop
- NSRunloop
- nsrunloop
- NSRunLoop
- NSRunloop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunloop
- java判断文字中是否包含URL
- nginx屏蔽指定URI
- Tomcat Ip 限制
- kvm vnc鼠标不同步的解决方式以及原因
- 原始套接字实现Ping命令
- NSRunLoop漫谈
- spring框架包下载地址
- JavaScript HTML DOM - 改变CSS
- 响应式网页设计:rem、em设置网页字体大小自适应
- 3.3final中,bit.lshift报错nil value
- 二叉树的三种遍历
- Linux下C++的多线程编程
- 9.Android 万能ViewHolder
- MFC读取文件内容