Overview
一个CFRunLoopSource对象是一个能被放入runloop的输入源的抽象。输入源能够代表性地产生异步事件,比如消息到达网络端口,或用户执行的动作。
一个输入源类型通常会定义一个API来创建和操作这个类型的对象,就像它是一个独立于runloop的实体,然后提供了一个方法来创建一个对象的CFRunLoopSource。然后这个runloopSource可以在runloop中注册(register),成为runloop和实际输入源对象的媒介。输入源(Examples of input sources)包括CFMachPort、CFMessagePort以及CFSocket。
sources有两种类别,Version 0 sources,因它们的上下文结构体中的version字段为0而得名,由application手动管理。当一个source准备好fire,application中的某些部分,可能是独立线程里等待事件的代码,就会调用CFRunLoopSourceSignal去通知runloop这个source已经准备好。CFSocket当前是作为version0的source来实现的。
Version 1 sources 由runloop和系统内核来管理。当这些source准备好fire时使用Mach ports来标记(signal)。当一条message到达source的Mach port,内核会自动标记(signal)一个资源。当这个资源被fire时,消息的内容会被交给资源来处理。CFMachPort和CFMessagePort现在作为version1的source来实现。
你可以在创建自定义的runloopSource时选择最适合你的version。
一个runloopSource可以同时在多个runloop以及多个runloopMode中注册(register)。当这个source被标记时,第一个接收到信号(detect the signal first)的runloop会fire这个source。你可以通过添加一个source进多个thread的runloop,以此来管理一个“工人”线程池(a pool of "worker" threads),这些线程用于处理离散的数据集合,比如通过网络的客户端-服务器通信(client-server messages)或由“管理者”线程填充的工作队列的条目(entries)。收到信息(messages arrive)或者工作被添加到队列(jobs get added to the queue)时,这个资源会被标记(signal),然后一个随机的线程会收到标记信息并处理请求(a random thread receives and processes the request)。
网友评论