background image

.线程间通信

线程间通信和进程间通信从本质上讲是相似的。线程间通信就是在进程内的两个执行流之间

进行数据的传递,就像两条并行的河流之间挖出了一道单向流动长沟,使得一条河流中的

水可以流入另一条河流,物质得到了传递。

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 = ( 

                   找软件资料,就到一览软件文库

http://wk.yl1001.com/rj/