RunLoop是線程中的一個事情處置循環,用來不時監聽事情輸出,並將其分配到相應的中央停止處置。
但是RunLoop不止是循環這麼復雜,它對事情停止了籠統和封裝,使你免去處置瑣碎的事情
並且它能在有任務的時分任務,沒任務的時分休眠。
線程與RunLoopRunLoop是線程的根底架構,每個線程,包括main線程都有與之對應的RunLoop
main線程的RunLoop是默許翻開的,IOS順序在main函數的UIApplicationMain辦法中,為main線程設置了一個NSRunLoop對象
所以我們的順序可以在有操作的時分及時呼應,沒操作的時分進入休眠,以增加資源占用
其他線程的RunLoop是默許不翻開的,當你需求更多的線程交互時,可以手動配置
RunLoop對象CFRunLoopRef是在 CoreFoundation 框架內的,它提供了純 C 函數的 API,一切這些 API 都是線程平安的。
NSRunLoop 是基於 CFRunLoopRef 的封裝,提供了面向對象的 API,但是這些 API 不是線程平安的。
NSRunLoop *mainRunLoop = [NSRunLoop mainRunLoop];
NSLog(@"#mainRunLoop:%p", mainRunLoop);
NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
NSLog(@"#currentRunLoop:%p", currentRunLoop);
CFRunLoopRef cfMainRunLoop = CFRunLoopGetMain();
NSLog(@"#cfMainRunLoop:%p", cfMainRunLoop);
CFRunLoopRef cfCurrentRunLoop = CFRunLoopGetCurrent();
NSLog(@"#cfCurrentRunLoop:%p", cfCurrentRunLoop);
// 子線程的RunLoop是默許不翻開的,需求自己創立
NSThread *newThread = [[NSThread alloc] initWithBlock:^{
// 子線程的RunLoop是懶加載的,在子線程中創立RunLoop,調用currentRunLoop辦法即可
NSRunLoop *newRunLoop = [NSRunLoop currentRunLoop];
NSLog(@"#newRunLoop:%p", newRunLoop);
}];
[newThread start];
什麼時分運用RunLoop
當你的順序需求輔佐線程的時分,開啟RunLoop可以堅持線程長時間存活。
參考文章深化了解RunLoop
IOS開發-Runloop詳解
RunLoop的復雜引見
【看法iOS的RunLoop】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!