北京iOS培训课程浅谈RunLoop
我会从几个方面阐述 Ru nLoop:
RunLoop的概念
RunLoop与线程的关系
苹果用Run Loop实现的功能
请大家跟随我一起开始了解 Ru nLoop。
RunLoop的概念
一般来讲,一个线程一次只能执行一个任务, 执行完成后线程就会退出。 如果我们需要
一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的:
Crayon Syn tax Highlighter function loop() {
in itialize();
do {
var message = get_ next_message();
process_message(message);
} while (message != quit);
function loop (){
in itialize ();
do{
var message = get_next_message ();
process_message (message);
} while (message != quit );
}
这种模型通常被称作 Eve nt Loop 。 Event Loop 在很多系统和框架里都有实现,比如
的事件处理,比如 Windows程序的消息循环, 再比如OSX/iOS里的RunLoop。实现 这种模型的关键点在于:如何管理事件 /消息,如何让线程在没有处理消息时休眠以避免资
源占用、在有消息到来时立刻被唤醒。
所以,Ru nLoop实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提 供了一个入口函数来执行上面 Event Loop的逻辑。线程执行了这个函数后,就会一直处于
这个函数内部”接受消息-> 等待-> 处理”的循环中,直到这个循环结束 (比如传入quit 的 消息),函数返回。
OSX/iOS系统中,提供了两个这样的对象: NSR un Loo和CFRu nLoopRef^
CFRunLoopRe是在CoreFoundation框架内的,它提供了纯 C函数的API,所有这些API 都是线程安全的。
NSRunLoo是基于CFRunLoopRef的封装,提供了面向对象的 API,但是这些API不是线 程安全的。
RunLoop与线程的关系
首先,iOS开发中能遇到两个线程对象:pthread_t和NSThread。过去苹果有份文档标明 了 NSThread只是pthread_t的封装,但那份文档已经失效了,现在它们也有可能都是直接包 装自最底层的mach thread。苹果并没有提供这两个对象相互转换的接口,但不管怎么样, 可以肯定的是pthread_t和NSThread是一一对应的。比如,你可以通过 pthread_main_thread_np() 或
[NSThreadmainThread] 来获取主线程;也可 以通过 pthread_self() 或[NSThreadcurrentThread] 来获取当前线程。CFRunLoo是基于 pthread 来管理的。
苹果不允许直接创建 Run Loop,它只提供了两个自动获取的函数: CFRu nLoopGetMai n()
和CFR
北京iOS培训课程浅谈RunLoop 来自淘豆网m.daumloan.com转载请标明出处.