OC原理RunLoop(一)

什麼是RunLoop

runloop是運行循環,在程序運行過程當中循環作一些事情網絡

RunLoop應用範疇

定時器、PerformSelector、GCD 事件響應、手勢識別、界面刷新、網絡請求、自動釋放池oop

獲取RunLoop對象

iOS中有2套API來訪問和使用RunLoop,分別是NSRunLoop和CFRunLoopRef 區別是NSRunLoo是基於CFRunLoopRef的一層OC包裝spa

RunLoop與線程的關係

每條線程都有惟一的一個與之對應的RunLoop對象,RunLoop保存在一個全局的Dictionary裏 線程做爲key,RunLoop做爲Value。線程剛建立時並無RunLoop對象,RunLoop會在第一次獲取它時建立,RunLoop會在線程結束時銷燬。主線程的RunLoop已經自動獲取,子線程默認沒有開啓RunLoop線程

獲取RunLoop對象的方式

Foundation

[NSRunLoop currentRunLoop]; // 獲取當前線程的RunLoop對象
[NSRunLoop mainRunLoop]; // 獲取主線程

Core Foundation

CFRunLoopGetCurrent();// CF 獲取當前線程
CFRunLoopGetMain(); // CF 獲取主線程

CFRunLoopModeRef

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

能夠經過以下代碼監聽loop的狀態

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;
        }
    });
相關文章
相關標籤/搜索