上一讲我们将到了GCD栅栏GCD栅栏(dispatch_barrier).这这一篇我们讲讲GCD的Timer
时间来不及了,赶快上车…
/// 创建一个Timer
// /**
// dispatch_source创建方法
//
// @param type 创建的dispatch_source的类型
// @param handle
// @param mask
// @param queue 添加到的队列
// @return 返回一个新创建的dispatch_source
// */
// dispatch_source_create(<#dispatch_source_type_t _Nonnull type#>, <#uintptr_t handle#>, <#unsigned long mask#>, <#dispatch_queue_t _Nullable queue#>)
// MARK: 1.创建一个Timer类型的dispatch_source_t
self.gcd_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
/// 设置Timer
// /**
// GCD-Timer的设置方法
//
// @param source 设置的timer
// @param start 开始延时多久(第一次执行的时候延时多久开始执行)
// @param interval 每次执行Timer的间隔(当使用dispatch_time或者DISPATCH_TIME_NOW时,系统会使用默认时钟来进行计时。然而当系统休眠的时候,默认时钟是不走。可以用dispatch_walltime让计时器按照真实时间间隔进行计时。)
// @param leeway 允许延迟的值
// @return <#return value description#>
// */
// dispatch_source_set_timer(<#dispatch_source_t _Nonnull source#>, <#dispatch_time_t start#>, <#uint64_t interval#>, <#uint64_t leeway#>)
/// 两个事件
// dispatch_time(<#dispatch_time_t when#>, <#int64_t delta#>)
/// param1:从某个时间点开始,不需要的话传NULL.
// _STRUCT_TIMESPEC timespec;
// // 秒
// timespec.tv_sec = 10;
// // 纳秒
// timespec.tv_nsec = ;
// dispatch_walltime(×pec, NSEC_PER_SEC * .5);
// dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>)
// dispatch_time(<#dispatch_time_t when#>, <#int64_t delta#>)
// MARK: 2.设置Timer的执行间隔时间、第一次执行的延时时间.
dispatch_source_set_timer(self.gcd_timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);
/// MARK: 3.Timer执行的方法
dispatch_source_set_event_handler(self.gcd_timer, ^{
});
// 另:可以传参的dispatch_source_set_event_handler
// dispatch_source_set_event_handler_f(<#dispatch_source_t _Nonnull source#>, <#dispatch_function_t _Nullable handler#>)
/// 执行Timer
/// MARK: 3.开启Timer.注:这个不能多次调用.建议用一个属性值记录Timer的执行状态.多次调用会崩溃.
dispatch_resume(self.gcd_timer);
/// MARK: 4.挂起Timer(挂起状态不能置为nil).只能在dispatch_resume后cancel.并且dispatch_resume和dispatch_suspend一一对应.重复调用dispatch_suspend会崩溃.
dispatch_suspend(self.gcd_timer);
/// MAKR: 5.取消Timer.置位nil之前一定要先取消...而且只有在resume状态才能取消.
dispatch_source_cancel(self.gcd_timer);
另,Timer执行方法带参数
/// Timer执行方法
void function(void *context) {
printf("3\n");
}
/// 设置Timer执行方法
dispatch_source_set_event_handler_f(self.gcd_timer, function);
/// 设置参数
dispatch_set_context(<#dispatch_object_t _Nonnull object#>, <#void * _Nullable context#>)