總的說來,Run loop他去,正如其名,loop表示某種循環(huán)倒堕,和run放在一起就表示一直在運行著的循環(huán)灾测。實際上,run loop和線程是緊密相連的垦巴,可以這樣說run loop是為了線程而生媳搪,沒有線程,它就沒有存在的必要骤宣。Run loops是線程的基礎架構部分秦爆,Cocoa和CoreFundation都提供了run loop對象方便配置和管理線程的run loop(以下都以Cocoa為例)。每個線程憔披,包括程序的主線程(main thread)都有與之相應的run loop對象等限。
runloop和線程的關系:主線程的run loop默認是啟動的。iOS的應用程序里面芬膝,程序啟動后會有一個如下的main()函數(shù)
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
重點是UIApplicationMain()函數(shù)望门,這個方法會為main thread設置一個NSRunLoop對象,這就解釋了:為什么我們的應用可以在無人操作的時候休息锰霜,需要讓它干活的時候又能立馬響應筹误。
對其它線程來說,run loop默認是沒有啟動的癣缅,如果你需要更多的線程交互則可以手動配置和啟動厨剪,如果線程只是去執(zhí)行一個長時間的已確定的任務則不需要。
在任何一個Cocoa程序的線程中友存,都可以通過以下代碼來獲取到當前線程的run loop祷膳。
NSRunLoop *runloop = [NSRunLoop currentRunLoop];