RunLoopTimerRef

CFRunLoopTimerRef 是基于时间的触发器
它和 NSTimer 是toll-free bridged 的,可以混用。其包含一个时间长度和一个回调(函数指针)。
当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。

Timer sources

Timer sources在预设的时间点synchronously同步的给 thread发送 evet.Timer 是thread 通知自己做某事的一种方式. 例如, search filed 可以使用一个 timer 来每隔一段时间自动去查询用户输入的信息.

尽管, Timer sources 会生成 time-based notifications, 但是 timer 并非完全真正的基于时间点的.同 input source 一样, Timer 也是和特定的RunLoopMode 有关的.如果Timer并不在当前 RunLoop 的 mode 的监控范围内,那么 Timer 就不会被触发,直到 RunLoop 切换到 Timer 所在的 mode 中.相似的是,如果 Timer 在当前 mode 触发了,但是 RunLoopMode 又被改变了,那么后面 Timer 就仍然不会被触发.

我们可以设置 Timer 的触发方式是once 一次性 或者 repeat 重复. 一个 repeating timer 重复触发依赖的时间是基于上一次的 fire time 的,并非实际的时间(有可能中间 runloopmode 有改变).例如, 一个 timer 设定的触发时间是每隔5s 触发一次,那么每一次激活都是前一次再加5s,即使前一次 fire 时间有 delay.即使有一次 fire time 延迟了很久,可能是13s,错过了两次 fire time,那么后面仍然只 fire 一次,在timer 这次 fire 过后, timer 又重新规划下次 fire 时间在5s 后.

Cocoa 和 CoreFoundation 中 NSTimer,CFRunLoopTimer 提供了相关方法来设置 Timer sources.需要注意的是除了scheduledTimerWithTimeInterval开头的方法创建的 Timer 都需要手动添加到当前RunLoop中.(scheduledTimerWithTimeInterval 创建的 timer 会自动以 default mode 加载到当前 RunLoop 中)

NSTimer是对RunLoopTimer的封装

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes;

+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;
- (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;

Timer 在选择使用一次后,在执行完成时,会从 RunLoop 中移除.选择循环时候,会一直保
存在当前 RunLoop 中,直到 invalidated 方法执行.

具体使用 timer 的实例:
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW6

你可能感兴趣的:(RunLoopTimerRef)