CFRunLoopObserver監(jiān)聽者,runloop事件。
public struct CFRunLoopActivity : OptionSet, @unchecked Sendable {
public init(rawValue: CFOptionFlags)
public static var entry: CFRunLoopActivity { get }
public static var beforeTimers: CFRunLoopActivity { get }
public static var beforeSources: CFRunLoopActivity { get }
public static var beforeWaiting: CFRunLoopActivity { get }
public static var afterWaiting: CFRunLoopActivity { get }
public static var exit: CFRunLoopActivity { get }
public static var allActivities: CFRunLoopActivity { get }
}
entry:即將進(jìn)入運(yùn)行循環(huán)
beforeTimers:即將處理timers
beforeSources:即將處理sources
beforeWaiting:即將等待,即將進(jìn)入休眠
afterWaiting:休眠之后,剛從休眠喚醒
exit:退出runloop循環(huán)
觀察runloop的狀態(tài)變化
public func CFRunLoopObserverCreateWithHandler(
_ allocator: CFAllocator!,//分配的空間
_ activities: CFOptionFlags, //要監(jiān)聽的狀態(tài)
_ repeats: Bool,
_ order: CFIndex,
_ block: ((CFRunLoopObserver?, CFRunLoopActivity) -> Void)!)
-> CFRunLoopObserver!
let actitities = CFRunLoopActivity.allActivities //actitities 傳入要監(jiān)聽的所有狀態(tài)
let allocator = CFAllocatorGetDefault().takeUnretainedValue()
let observer = CFRunLoopObserverCreateWithHandler(allocator,
actitities.rawValue,
true,
0) { observer, activity in
switch activity {
case .entry :
print("進(jìn)入runloop循環(huán)")
case .beforeTimers:
print("即將處理timers")
case .beforeSources:
print("即將處理Source")
case .beforeWaiting:
print("即將休眠")
case .afterWaiting:
print("剛從休眠喚醒")
case .exit:
print("runloop循環(huán)結(jié)束")
default:
break
}
}
CFRunLoopAddObserver(runloop, observer, .defaultMode)