RunLoop篇

main函數爲什麼是一直運行的?


RunLoop整個流程圖


#import "MCObject.h"

@implementation MCObject

static NSThread *thread = nil;
// 標記是否要繼續事件循環
static BOOL runAlways = YES;

+ (NSThread *)threadForDispatch{
    if (thread == nil) {
        @synchronized(self) {
            if (thread == nil) {
                // 線程的創建
                thread = [[NSThread alloc] initWithTarget:self selector:@selector(runRequest) object:nil];
                [thread setName:@"com.imooc.thread"];
                //啓動
                [thread start];
            }
        }
    }
    return thread;
}

+ (void)runRequest
{
    // 創建一個Source
    CFRunLoopSourceContext context = {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
    CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
    
    // 創建RunLoop,同時向RunLoop的DefaultMode下面添加Source
    CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
    
    // 如果可以運行
    while (runAlways) {
        @autoreleasepool {
            // 令當前RunLoop運行在DefaultMode下面
            CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, true);
        }
    }
    
    // 某一時機 靜態變量runAlways = NO時 可以保證跳出RunLoop,線程退出
    CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
    CFRelease(source);
}

@end

『RunLoop』詳盡總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章