美文网首页
iOS YYTimer 源码阅读

iOS YYTimer 源码阅读

作者: 杨柳小易 | 来源:发表于2017-03-20 16:47 被阅读413次

    <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> 的源码,要坚持看完

    相关文章

      网友评论

          本文标题:iOS YYTimer 源码阅读

          本文链接:https://www.haomeiwen.com/subject/cgkinttx.html