理解
进程是一家工厂,线程是一个流水线,Run Loop就是流水线上的主管;当工厂接到商家的订单分配给这个流水线时,Run Loop就启动这个流水线,让流水线动起来,生产产品;当产品生产完毕时,Run Loop就会暂时停下流水线,节约资源。
RunLoop管理流水线,流水线才不会因为无所事事被工厂销毁;而不需要流水线时,就会辞退RunLoop这个主管,即退出线程,把所有资源释放。
RunLoop并不是iOS平台的专属概念,在任何平台的多线程编程中,为控制线程的生命周期,接收处理异步消息都需要类似RunLoop的循环机制实现,Android的Looper就是类似的机制。
何时使用RunLoop?
仅当在为你的程序创建辅助线程的时候,你才需要显式运行一个runloop。Runloop是程序主线程基础设施的关键部分。所以,Cocoa程序提供了代码运行主程序的循环并自动启动runloop。iOS程序中UIApplication的run方法作为程序启动步骤的一部分,它在程序正常启动的时候就会启动程序的主循环。如果你使用Xcode提供的模板创建你的程序,那你永远不需要自己去显式的调用这些例程。
对于辅助线程,你需要判断一个runloop是否是必须的。如果是必须的,那么你要自己配置并启动它。你不需要在任何情况下都去启动一个线程的runloop。比如,你使用线程来处理一个预先定义的长时间运行的任务时,你应该避免启动runloop。Runloop在你要和线程有更多的交互时才需要,比如以下情况:
1.使用端口或自定义输入源来和其他线程通信。 AFNetworking中的子线程_networkRequestThread就是通过使用端口NSMachPort加入到runloop中的。
2.使用线程的定时器。一般就是加入到CommonMode模式的runloop中。
3.Cocoa中使用任何performSelector...的方法。
4.使线程周期性工作。