Skip to content

讲一下 Observer ? #104

@tbfungeek

Description

@tbfungeek

RunLoop 的 Observer 会在RunLoop关键节点收到通知:

iOS中定义了如下类型的通知:

typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry = (1UL << 0),               //进入Runloop
    kCFRunLoopBeforeTimers = (1UL << 1),        //即将开始处理Timmers
    kCFRunLoopBeforeSources = (1UL << 2),       //即将开始处理Source
    kCFRunLoopBeforeWaiting = (1UL << 5),       //即将进入休眠状态
    kCFRunLoopAfterWaiting = (1UL << 6),        //退出休眠状态
    kCFRunLoopExit = (1UL << 7),                //退出Runloop
    kCFRunLoopAllActivities = 0x0FFFFFFFU
};

Observer结构定义如下:

struct __CFRunLoopObserver {
    CFRuntimeBase _base;
    pthread_mutex_t _lock;
    CFRunLoopRef _runLoop;
    CFIndex _rlCount;
    CFOptionFlags _activities;		/* immutable */
    CFIndex _order;			/* immutable */
    CFRunLoopObserverCallBack _callout;	/* immutable */
    CFRunLoopObserverContext _context;	/* immutable, except invalidation */
};

__CFRunLoopObserver 里面最关键的字段是 _callout,它会在通知发出的时候被回调。

添加观察者:

CFRunLoopObserverRef observer
    = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAfterWaiting, true, 0,
                                         ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        //取出activity就是通知类型
});
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions