GCD延时取消

作者: Jack_deng | 来源:发表于2018-01-18 10:51 被阅读189次

平常的开发中,经常要用到延时处理功能,一般比较实用的有2种方法,一是performSelector:withObject:afterDelay:,还有一种是GCD的dispatch_after函数,我觉得后者比前者用起来方便很多,因为是block,代码可以写在一个地方。但是dispatch_after有个缺点,就是不能取消。我们做超时处理等功能时,需要在某些条件成功以后取消这个超时的处理。而performSelectorcancelPreviousPerformRequestsWithTarget来实现取消功能。好消息是在iOS8以后多了一个GCD的取消函数。代码如下:

dispatch_block_t block = dispatch_block_create(DISPATCH_BLOCK_BARRIER, ^{
        NSLog(@"我被取消了,所以你看不到我");
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(),block );
    dispatch_block_cancel(block);
// 因为有dispatch_block_cancel,所以你看不到打印。如果注释掉dispatch_block_cancel,就有打印

这里要特别说明一下,dispatch_block_t其实就是typedef void (^dispatch_block_t)(void);,它是一个普通的返回值为void,无参的block。dispatch_after的函数声明:dispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block);,如果要实现支持取消的dispatch_after,第三个参数你就不能传普通的dispatch_block_t,必须要传dispatch_block_createdispatch_block_create_with_qos_class
创建的block,否则不但不能取消,而且还会崩溃的。

dispatch_block_t block =  ^{
        NSLog(@"不能这样写,会崩溃的哦");
    };
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(),block );
    dispatch_block_cancel(block);

参考资料:dispatch_block_cancel

相关文章

  • 「取消」 GCD 延时队列

    在 iOS SDK 里面是无法取消提交的任务的,这里实现一个可以取消的例子。 void dispatch_afte...

  • GCD延时取消

    平常的开发中,经常要用到延时处理功能,一般比较实用的有2种方法,一是performSelector:withObj...

  • GCD延时任务取消

    1.dispatch_block_cancel iOS8之后可以调用dispatch_block_cancel来取...

  • iOS小知识点(GCD)

    GCD延时加载 主线程更新UI

  • GCD延时

    在主线程中延迟执行某动作,不会卡主主线程,不影响后面的东做执行 在子线程中执行某动作,不会卡主整个线程

  • GCD

    1,GCD 栅栏方法:dispatch_barrier_async 2,GCD 延时执行方法:dispatch_a...

  • 7.3 多线程-GCD

    多线程-GCD 多线程-GCD-串行并行 多线程-GCD.png GCD-线程的通讯、延时操作、定时器 GCD-线...

  • 【瞎搞iOS开发09】聊一聊Block和[Block copy]

    本文扯些啥 一种取消GCD延时任务的解决方案 非常简单的介绍3种Block类型 ARC模式打印引用计数retian...

  • Swift小项目的细碎知识点

    一、GCD延时调用 HUD_DISMISS_TIME为延时执行的时间 二、GCD队列 三、判断一个对象是否为空 四...

  • 7.多线程基础(七)GCD加强

    1.GCD串行队列和并发队列 2.GCD延时执行 3.GCD线程组:(的作用) 4.GCD定时器: GCD的实现 ...

网友评论

    本文标题:GCD延时取消

    本文链接:https://www.haomeiwen.com/subject/uzyioxtx.html