GCD定时器


GCD定时器的优势:不受RunLoop的运行模式的影响(因为它的底层也是C语言)


Xcode自带的代码块保存的有,直接dispatch就出来;填入参数即可


但是记得relaease

它的的间隔时间是纳秒为单位,(面试)

注意:它本质是个结构体,如果没有定义一个属性用强指针应用它(strong),他会被销毁,

NStimer定时器:会受到RunLoop的运行模式的影响

每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode


如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入

这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响


一个 RunLoop 包含若干个 Mode,每个Mode又包含若干个Source/Timer/Observer





@interface
ViewController () @property (nonatomic ,strong)dispatch_source_t timer; // 注意:此处应该使用强引用 strong @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //0.创建队列 dispatch_queue_t queue = dispatch_get_main_queue(); //1.创建GCD中的定时器 /* 第一个参数:创建source的类型 DISPATCH_SOURCE_TYPE_TIMER:定时器 第二个参数:0 第三个参数:0 第四个参数:队列 */ dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); //2.设置时间等 /* 第一个参数:定时器对象 第二个参数:DISPATCH_TIME_NOW 表示从现在开始计时 第三个参数:间隔时间 GCD里面的时间 纳秒 第四个参数:精准度(表示允许的误差,0表示绝对精准) */
Xcode的代码苦衷搜索Dispatch就有,不用敲
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    
    //3.要调用的任务
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"GCD-----%@",[NSThread currentThread]);
    });
    
    //4.开始执行
    dispatch_resume(timer);

    
    self.timer = timer;
}
@end
原文地址:https://www.cnblogs.com/mshong1616/p/5096512.html