<code>YYTimer</code>源码阅读
根据 <code> YYTimer </code>头文件提示,<code>YYTimer</code> 是一个线程安全的类,和 <code>NSTimer</code> 具有类似的APT ,比<code> NSTimer</code> 改进的地方时:<code>YYTimer</code> 是基于<code> GCD </code> 的,并且不受<code> runLoop</code> 的影响,对 <code>target</code> 是<code> weak</code> 引用,不会引起循环引用的问题,总是在主线程调用。
声明如下:
@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操作的写响应
其实今天重点阅读了 <code>YYTextKeyboardManager</code> 但是不知道怎么写,牛逼已经吹出来了, <code>YYKit</code> 的源码,要坚持看完