CFRunloopTimerRef

CFRunloopTimerRef

CFRunLoopTimerRef是基于时间的触发器

基本上说的就是NSTimer,它会受到runloop的mode的影响

GCD的定时器不受Runloop的mode的影响

(1)NSTimer相关代码

  • 详见NSTimer

(2)GCD中的定时器

//  0.创建一个队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    //1.创建一个GCD的定时器
    /*
     第一个参数:要监听的类型-DISPATCH_SOURCE_TYPE_TIMER:创建的是定时器
     第二个参数:要监听的是那个线程等 默认传0
     第三个参数:描述信息 默认0
     第四个参数:队列 决定3步中的block在哪个线程中执行
     */
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

    //2.设置定时器的开始时间,间隔时间以及精准度

    //设置开始时间,三秒钟之后调用
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW,3.0 *NSEC_PER_SEC);
    //设置定时器工作的间隔时间
    uint64_t intevel = 1.0 * NSEC_PER_SEC;

    /*
     第一个参数:要给哪个定时器设置
     第二个参数:定时器的开始时间,DISPATCH_TIME_NOW表示从当前开始
     第三个参数:定时器调用方法的间隔时间
     第四个参数:定时器的精准度,如果传0则表示采用最精准的方式计算,如果传大于0的数值,则表示该定时切换i可以接收该值范围内的误差,通常传0
     该参数的意义:可以适当的提高程序的性能
     注意点:GCD定时器中的时间以纳秒为单位(面试)
     */

    dispatch_source_set_timer(timer, start, intevel, 0 * NSEC_PER_SEC);

    //  3.设置定时器开启后触发的事件或者操作
    /*
     第一个参数:要给哪个定时器设置
     第二个参数:触发的事件或者操作
     */
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"------%@",[NSThread currentThread]);
    });

    //4.执行定时器
    dispatch_resume(timer);

    //注意:dispatch_source_t本质上是OC类,在这里是个局部变量,需要强引用
    self.timer = timer;

你可能感兴趣的:(CFRunloopTimerRef)