理解
進程是一家工廠翘紊,線程是一個流水線,Run Loop就是流水線上的主管暮刃;當(dāng)工廠接到商家的訂單分配給這個流水線時跨算,Run Loop就啟動這個流水線,讓流水線動起來椭懊,生產(chǎn)產(chǎn)品诸蚕;當(dāng)產(chǎn)品生產(chǎn)完畢時,Run Loop就會暫時停下流水線氧猬,節(jié)約資源背犯。
RunLoop管理流水線,流水線才不會因為無所事事被工廠銷毀盅抚;而不需要流水線時漠魏,就會辭退RunLoop這個主管,即退出線程妄均,把所有資源釋放柱锹。
RunLoop并不是iOS平臺的專屬概念,在任何平臺的多線程編程中丛晦,為控制線程的生命周期奕纫,接收處理異步消息都需要類似RunLoop的循環(huán)機制實現(xiàn),Android的Looper就是類似的機制烫沙。
何時使用RunLoop?
僅當(dāng)在為你的程序創(chuàng)建輔助線程的時候隙笆,你才需要顯式運行一個runloop锌蓄。Runloop是程序主線程基礎(chǔ)設(shè)施的關(guān)鍵部分。所以撑柔,Cocoa程序提供了代碼運行主程序的循環(huán)并自動啟動runloop瘸爽。iOS程序中UIApplication的run方法作為程序啟動步驟的一部分,它在程序正常啟動的時候就會啟動程序的主循環(huán)铅忿。如果你使用Xcode提供的模板創(chuàng)建你的程序剪决,那你永遠不需要自己去顯式的調(diào)用這些例程。
對于輔助線程檀训,你需要判斷一個runloop是否是必須的柑潦。如果是必須的,那么你要自己配置并啟動它峻凫。你不需要在任何情況下都去啟動一個線程的runloop渗鬼。比如,你使用線程來處理一個預(yù)先定義的長時間運行的任務(wù)時荧琼,你應(yīng)該避免啟動runloop譬胎。Runloop在你要和線程有更多的交互時才需要差牛,比如以下情況:
1.使用端口或自定義輸入源來和其他線程通信。 AFNetworking中的子線程_networkRequestThread就是通過使用端口NSMachPort加入到runloop中的堰乔。
2.使用線程的定時器偏化。一般就是加入到CommonMode模式的runloop中。
3.Cocoa中使用任何performSelector...的方法镐侯。
4.使線程周期性工作夹孔。