-
Notifications
You must be signed in to change notification settings - Fork 8
Open
Description
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
Labels
No labels