runloop是運行循環,在程序運行過程當中循環作一些事情網絡
定時器、PerformSelector、GCD 事件響應、手勢識別、界面刷新、網絡請求、自動釋放池oop
iOS中有2套API來訪問和使用RunLoop,分別是NSRunLoop和CFRunLoopRef 區別是NSRunLoo是基於CFRunLoopRef的一層OC包裝spa
每條線程都有惟一的一個與之對應的RunLoop對象,RunLoop保存在一個全局的Dictionary裏 線程做爲key,RunLoop做爲Value。線程剛建立時並無RunLoop對象,RunLoop會在第一次獲取它時建立,RunLoop會在線程結束時銷燬。主線程的RunLoop已經自動獲取,子線程默認沒有開啓RunLoop線程
[NSRunLoop currentRunLoop]; // 獲取當前線程的RunLoop對象 [NSRunLoop mainRunLoop]; // 獲取主線程
CFRunLoopGetCurrent();// CF 獲取當前線程 CFRunLoopGetMain(); // CF 獲取主線程
CFRunLoopModeRef表明RunLoop的運行模式,一個RunLoop包含若干個Mode,每一個Mode又包含若干個Source0/Source1/Timer/Observercode
RunLoop啓動時只能選擇其中一個Mode,做爲currentMode,若是須要切換Mode,只能退出當前Loop,再從新選擇一個Mode進入orm
不一樣組的Source0/Source1/Timer/Observer能分隔開來,互不影響,若是Mode裏沒有任何Source0/Source1/Timer/Observer,RunLoop會立馬退出server
CFRunLoopObserverRef observe = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAllActivities, true, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) { switch (activity) { case kCFRunLoopEntry: // 進入loop NSLog(@"kCFRunLoopEntry"); break; case kCFRunLoopBeforeTimers: // 即將處理定時器 NSLog(@"kCFRunLoopBeforeTimers"); break; case kCFRunLoopBeforeSources: // 即將處理Source NSLog(@"kCFRunLoopBeforeSources"); break;; case kCFRunLoopBeforeWaiting: // 即將進入休眠 NSLog(@"kCFRunLoopBeforeWaiting"); break;; case kCFRunLoopAfterWaiting: // 即將結束休眠 NSLog(@"kCFRunLoopAfterWaiting"); break; case kCFRunLoopExit: // 即將退出loop NSLog(@"kCFRunLoopExit"); break; default: break; } });