runloop和線程有什么關(guān)系实辑?
總的說來臣疑,Run loop,正如其名徙菠,loop表示某種循環(huán)讯沈,和run放在一起就表示一直在運(yùn)行著的循環(huán)。
實(shí)際上婿奔,run loop和線程是緊密相連的缺狠,可以這樣說run loop是為了線程而生,沒有線程萍摊,它就沒有存在的必要挤茄。
Run loops是線程的基礎(chǔ)架構(gòu)部分,Cocoa和CoreFundation都提供了run loop對(duì)象方便配置和管理線程的run loop冰木。
每個(gè)線程穷劈,包括程序的主線程(main thread)都有與之相應(yīng)的run loop對(duì)象。
runloop和線程的關(guān)系:主線程的run loop默認(rèn)是啟動(dòng)的, 子線程的runloop默認(rèn)是不開啟的,需要我們自己手動(dòng)開啟循環(huán); 踊沸。
iOS的應(yīng)用程序里面歇终,程序啟動(dòng)后會(huì)有一個(gè)如下的main()函數(shù)
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));
}
}
也就是我們常說的主循環(huán)!!!
重點(diǎn)是UIApplicationMain()函數(shù),這個(gè)方法會(huì)為main thread設(shè)置一個(gè)NSRunLoop對(duì)象逼龟,這就解釋了:為什么我們的應(yīng)用可以在無人操作的時(shí)候休息评凝,需要讓它干活的時(shí)候又能立馬響應(yīng)。
對(duì)其它線程來說腺律,run loop默認(rèn)是沒有啟動(dòng)的奕短,如果你需要更多的線程交互則可以手動(dòng)配置和啟動(dòng),如果線程只是去執(zhí)行一個(gè)長(zhǎng)時(shí)間的已確定的任務(wù)則不需要匀钧。
在任何一個(gè)Cocoa程序的線程中翎碑,都可以通過以下代碼來獲取到當(dāng)前線程的run loop。
NSRunLoop *runloop = [NSRunLoop currentRunLoop];