RunLoop 初识

2020-04-13  本文已影响0人  游城十代2dai

0x00 RunLoop 是什么?

在程序运行的过程中循环做的一些事情, 保证 main 函数不会直接退出, 并处理各种事件, 节省 CPU 资源, 提高性能

0x01 应用在哪里?

0x02 RunLoop 对象

有两套 API 可以获取

0x03 线程

0x04 RunLoop 的类

struct __CFRunLoop {
    pthread_t _pthread;
    CFMutableSetRef _commonModes;
    CFMutableSetRef _commonModeItems;
    CFRunLoopModeRef _currentMode;
    CFMutableSetRef _modes;
};


struct __CFRunLoopMode {
    CFStringRef _name;
    CFMutableSetRef _sources0;
    CFMutableSetRef _sources1;
    CFMutableArrayRef _observers;
    CFMutableArrayRef _timers;
};

0x05 CFRunLoopModeRef

0x06 CFRunLoopObserverRef

// 创建 
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopBeforeWaiting | kCFRunLoopAfterWaiting, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) { });
// 添加监听        
CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
// 释放
CFRelease(observer);
/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry = (1UL << 0),   // 即将进入 Loop
    kCFRunLoopBeforeTimers = (1UL << 1), // 即将处理Timer
    kCFRunLoopBeforeSources = (1UL << 2), // 即将处理 Source
    kCFRunLoopBeforeWaiting = (1UL << 5), // 即将进入睡眠
    kCFRunLoopAfterWaiting = (1UL << 6), // 刚从睡眠中唤醒
    kCFRunLoopExit = (1UL << 7), // 即将退出 Loop
    kCFRunLoopAllActivities = 0x0FFFFFFFU
};

0x07 运行逻辑

0x08 睡眠原理

上一篇 下一篇

猜你喜欢

热点阅读