GCD定时器(GCD Timer)

上一讲我们将到了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(&timespec, 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#>)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值