如何优美使用GCD的取消延时事件

使用方式

1.创建

 LKAfterTask *task = [[LKAfterTask alloc]init1;

2.需要延时处理的事件

[task afterTask:^{
 
    //此处为需要延时执行的方法
 
     } withAfterTime:0.5]; 

3.处理,判断是否使用了延时方法

if ([task isUseAfterTask]) {

  //使用了延时方法

  }else {
  //还未使延时方法
  //需要取消使用
  [task cancelAfterTask];

  }


实现文件

#import <Foundation/Foundation.h>

@interface LKAfterTask : NSObject

/**
 是否已经使用了延时的方法 使用返回YES,没有使用返回NO
 
 @return 是或者不是
 */
-(BOOL)isUseAfterTask;


/**
 调用这个方法已执行延时事件
 
 @param action 需要执行的延时事件
 @param time 需要执行的延时事件所需的时间
 */
-(void)afterTask:(void (^)(void))task withAfterTime:(NSTimeInterval)time;


/**
 取消想要执行的延时事件
 */
-(void)cancelAfterTask;


@end

#import "LKAfterTask.h"

@interface LKAfterTask ()

@property (nonatomic, assign) BOOL useAfterTask;

@property (nonatomic, copy) dispatch_block_t loadWaitingTask;

@end

@implementation LKAfterTask

-(void)afterTask:(void (^)(void))task  withAfterTime:(NSTimeInterval)time{
    
    
    dispatch_block_t loadWaitingTask = dispatch_block_create(DISPATCH_BLOCK_BARRIER, ^{
        
        self.useAfterTask = YES;
        
        task();
    });
    
    _loadWaitingTask = loadWaitingTask;
    
    dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(time * NSEC_PER_SEC));
    
    dispatch_after(delayTime, dispatch_get_main_queue(), loadWaitingTask);
}



-(void)setUseAfterTask:(BOOL)useAfterTask {
    
    _useAfterTask = useAfterTask;
    
    if (!_useAfterTask) {
        
        dispatch_block_cancel(_loadWaitingTask);
        
    }
    
}


-(void)cancelAfterTask {
    
    self.useAfterTask = NO;
}

-(BOOL)isUseAfterTask {
    
    return self.useAfterTask;
}

@end

转载于:https://my.oschina.net/u/3653408/blog/1511991

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值