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