iOS YYTimer 源码阅读

YYTimer源码阅读

根据 YYTimer 头文件提示,YYTimer 是一个线程安全的类,和 NSTimer 具有类似的APT ,比 NSTimer 改进的地方时:YYTimer 是基于 GCD 的,并且不受 runLoop 的影响,对 target weak 引用,不会引起循环引用的问题,总是在主线程调用。

声明如下:

@interface YYTimer : NSObject

/// 构造方法
+ (YYTimer *)timerWithTimeInterval:(NSTimeInterval)interval
                            target:(id)target
                          selector:(SEL)selector
                           repeats:(BOOL)repeats;

- (instancetype)initWithFireTime:(NSTimeInterval)start
                        interval:(NSTimeInterval)interval
                          target:(id)target
                        selector:(SEL)selector
                         repeats:(BOOL)repeats NS_DESIGNATED_INITIALIZER;
/// 是否重复
@property (readonly) BOOL repeats;
/// 时间间隔
@property (readonly) NSTimeInterval timeInterval;
/// 是否有效
@property (readonly, getter=isValid) BOOL valid;
/// 失效
- (void)invalidate;
/// 启动
- (void)fire;

@end

实现主要是依赖于GCD,具体如下

/// 创建一个锁
    _lock = dispatch_semaphore_create(1);
    /// 创建一个 dispatch_source_t
    _source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
    dispatch_source_set_timer(_source, dispatch_time(DISPATCH_TIME_NOW, (start * NSEC_PER_SEC)), (interval * NSEC_PER_SEC), 0);
    dispatch_source_set_event_handler(_source, ^{[_self fire];});
    dispatch_resume(_source);
  • 创建一个 dispatch_source_t,并且设置 type 为 DISPATCH_SOURCE_TYPE_TIMER,dispatch_queue_t 设置为 dispatch_get_main_queue,
  • 调用dispatch_source_set_event_handler 设置回调函数,
  • dispatch_resume 一开始是暂停状态,调用一下恢复。

可以看出,主要实现原理就是给 dispatch_source_t 设置时间源。

dispatch_source_t创建的时候,可以设置的type 有

DISPATCH_SOURCE_TYPE_DATA_ADD   自定义的事件,变量增加
DISPATCH_SOURCE_TYPE_DATA_OR    自定义的事件,变量OR
DISPATCH_SOURCE_TYPE_MACH_SEND  MACH端口发送
DISPATCH_SOURCE_TYPE_MACH_RECV  MACH端口接收
DISPATCH_SOURCE_TYPE_PROC   进程监听,如进程的退出、创建一个或更多的子线程、进程收到UNIX信号
DISPATCH_SOURCE_TYPE_READ   IO操作,如对文件的操作、socket操作的读响应
DISPATCH_SOURCE_TYPE_SIGNAL 接收到UNIX信号时响应
DISPATCH_SOURCE_TYPE_TIMER  定时器
DISPATCH_SOURCE_TYPE_VNODE  文件状态监听,文件被删除、移动、重命名
DISPATCH_SOURCE_TYPE_WRITE  IO操作,如对文件的操作、socket操作的写响应

其实今天重点阅读了 YYTextKeyboardManager 但是不知道怎么写,牛逼已经吹出来了, YYKit 的源码,要坚持看完

你可能感兴趣的:(iOS YYTimer 源码阅读)