文档章节

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

f
 faxianlei
发布于 2017/08/17 13:18
字数 261
阅读 71
收藏 0

使用方式

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

© 著作权归作者所有

f
粉丝 0
博文 1
码字总数 261
作品 0
私信 提问
ios中timer相关的延时调用需要注意的地方

ios中timer相关的延时调用,常见的有两种,一种是NSObject中的performSelector:withObject:afterDelay:以及performSelector:withObject:afterDelay:inModes:。这两个方法在调用的时候会设置当...

赵翊腾
2013/07/23
6.6K
0
iOS中延时执行的几种方式的比较和汇总

本文列举了四种延时执行某函数的方法及其一些区别。假如延时1秒时间执行下面的方法。 - (void)delayMethod { NSLog(@"execute"); } 1.performSelector方法 [self performSelector:@selector(...

Im刘亚芳
2015/01/13
0
0
iOS几种常用的延迟执行方法

转自http://blog.csdn.net/chenyong05314/article/details/24695897 本文列举了四种延时执行某函数的方法及其一些区别。假如延时1秒时间执行下面的方法。 1.performSelector方法 此方式要求必...

卡奇匠
2016/06/16
90
0
iOS多线程全面解读(二):GCD

写在前面 本系列文章列表 概述、NSThread GCD NSOperation 锁 GCD(Grand Central Dispatch)是iOS4引入的强大的线程处理技术,它是基于XNU内核开发的,性能极为优越。 GCD是最受欢迎的多线程...

indulge_in
2017/11/30
0
0
iOS开发中方法延迟执行的几种方式

概述 项目开发中经常会用到方法的延时调用,下面列举常用的几种实现方式: 1.performSelector 2.NSTimer 3.NSThread线程的sleep 4.GCD 1.performSelector 此方法是一种非阻塞的执行方式。 取...

大不不
2018/07/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部