首页 > 代码库 > iOS开发线程和RunLoop

iOS开发线程和RunLoop

一般来讲,一个线程一次只能执行一个任务,执行完毕后线程就会退出,如果我们需要一个机制让线程能随时处理时间但并不退出,通常的代码逻辑是这样:

技术分享

这就是 Event Loop框架。

runloop实际上就是一个管理其需要处理的事件和消息的对象,并提供了一个入口函数来执行上面Event loop的逻辑。线程执行了这个函数之后,就会一直处于这个函数内部“接受消息-》等待-》处理”的循环中,知道这个循环结束(例如传入quite消息),函数返回。

在OSX和iOS系统中,提供了两个这样的对象:NSRunLoop和CFRunLoopRef。

CFRunLoopRef是基于CoreFoundation框架内的,它提供了纯C函数的API,所有这些API都是线程安全的。

NSRunLoop是基于CFRunLoopRef的封装,提供面向对象的API,但是这些API不是线程安全的。

RunLoop和线程的关系:iOS开发中有两个线程对象-pthread_t和NSThread。pthread_tNSThread是一一对应的。比如你可以通过pthrea_main_thread_np()或者[NSThread currentThread]来获取当前线程。CFRunLoop是基于pthread来管理的。

苹果不允许直接创建RunLoop,但是提供了两个自动获取的函数:CFRunLoopGetMain()和CGRunLoopGetCurrent()。这两个函数的内部逻辑大概为:

技术分享

线程和RunLoop之间是一一对应的,其关系是保存在一个全局的Dictionary里。线程刚创建时并没有RunLoop,如果你不主动获取,它一直都不会有。runloop的创建是发生在第一次获取的时候,销毁时在线程结束时。你只能在一个线程的内部获取其RunLoop(主线程除外)。

Event驱动  主体就是一个死循环,没事-休眠,有事-唤醒-执行  

runloop:用于结局

1、使程序一直运行并接受用户输入

2、决定程序在何时应该处理哪些Event

3、调用解耦(Message Queue)

4、节省cpu时间

iOS开发线程和RunLoop