四
.线程间通信
线程间通信和进程间通信从本质上讲是相似的。线程间通信就是在进程内的两个执行流之间
进行数据的传递,就像两条并行的河流之间挖出了一道单向流动长沟,使得一条河流中的
水可以流入另一条河流,物质得到了传递。
1.performSelect>
@interface
NSObject
(NSThreadPerformAdditions)
-
(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUnti
2.Mach Port
在 苹 果 的
Thread Programming Guide 的 Run Pool 一 节 的 Configuring a Port-Based Input
Source 这一段中就有使用 Mach Port 进行线程间通信的例子。 其实质就是父线程创建一个
NSMachPort 对象,在创建子线程的时候以参数的方式将其传递给子线程,这样子线程中就
可以向这个传过来的
NSMachPort 对象发送消息,如果想让父线程也可以向子线程发消息
的 话,那么 子线程可以先向父线程发个特殊 的消 息, 传过来的是自己创建的另一个
NSMachPort 对象,这样父线程便持有了子线程创建的 port 对象了,可以向这个子线程的
port 对象发送消息了。
当然各自的
port 对象需要设置 delegate 以及 schdule 到自己所在线程的 RunLoop 中,这样来
了消息之后,处理
port 消息的 delegate 方法会被调用,你就可以自己处理消息了。
五
.RunLoop
RunLoop 从字面上看是运行循环的意思,这一点也不错,它确实就是一个循环的概念,或
者准确的说是线程中的循环。
本文一开始就提到有些程序是一个圈,这个圈本质上就是这
里的所谓的
RunLoop,就是一个循环,只是这个循环里加入很多特性。
首先循环体的开始需要检测是否有需要处理的事件,如果有则去处理,如果没有则进入睡
眠以节省
CPU 时间。 所以重点便是这个需要处理的事件,在 RunLoop 中,需要处理的事件
分两类,一种是输入源,一种是定时器,定时器好理解就是那些需要定时执行的操作,输
入源分三类:
performSelector 源,基于端口(Mach port)的源,以及自定义的源。编程的时
候可以添加自己的源。
RunLoop 还有一个观察者 Observer 的概念,可以往 RunLoop 中加入
自己的
观察者以便监控着 RunLoop 的运行过程,CFRunLoop.h 中定义了所有观察者的类型:
5
enum CFRunLoopActivity { kCFRunLoopEntry = (1 << 0), kCFRunLoopBeforeTimers
= (1 << 1), kCFRunLoopBeforeSources = (
找软件资料,就到一览软件文库