美文网首页大前端开发
dispatch_after的延迟执行怎么取消?

dispatch_after的延迟执行怎么取消?

作者: link_hui | 来源:发表于2018-07-24 22:29 被阅读7次

dispatch的延迟执行定时使用的时候可以传递block,使用的时候比较方便。

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        delay_block()
    });

但没有直接的方法可以取消。

Dispatch-Cancel提供了一种方法可以取消。

typedef void(^PDDelayedBlockHandle)(BOOL cancel);

static void cancel_delayed_block(PDDelayedBlockHandle delayedHandle) {
    if (nil == delayedHandle) {
        return;
    }
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        delayedHandle(YES);
    });
}

static PDDelayedBlockHandle perform_block_after_delay(CGFloat seconds, dispatch_block_t block) {
    if (block == nil) {
        return nil;
    }
    
    __block dispatch_block_t blockToExecute = [block copy];
    __block PDDelayedBlockHandle delayHandleCopy = nil;
    
    PDDelayedBlockHandle delayHandle = ^(BOOL cancel) {
        if (!cancel && blockToExecute) {
            blockToExecute();
        }
        
        // Once the handle block is executed, canceled or not, we free blockToExecute and the handle.
        // Doing this here means that if the block is canceled, we aren't holding onto retained objects for any longer than necessary.
#if !__has_feature(objc_arc)
        [blockToExecute release];
        [delayHandleCopy release];
#endif
        
        blockToExecute = nil;
        delayHandleCopy = nil;
    };
    // delayHandle also needs to be moved to the heap.
    delayHandleCopy = [delayHandle copy];
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        if (nil != delayHandleCopy) {
            delayHandleCopy(NO);
        }
    });
    
    return delayHandleCopy;
}

相关文章

  • dispatch_after的延迟执行怎么取消?

    dispatch的延迟执行定时使用的时候可以传递block,使用的时候比较方便。 但没有直接的方法可以取消。 Di...

  • iOS dispatch_after

    dispatch_after是来延迟执行的GCD方法,dispatch_after能让我们添加进队列的任务延时执行...

  • iOS多线程-GCD之常用函数

    延迟执行任务函数dispatch_after(.....)-(void)touchesBegan:(NSSet ...

  • dispatch_after

    dispatch_after属于GCD,能够实现延迟执行的语法,或者说是GCD中延迟执行的函数。使用dispatc...

  • iOS之GCD的使用

    一、延迟执行:dispatch_after 二、栅栏方法:dispatch_barrier_async 在执行完栅...

  • dispatch_after 造成对象延迟释放

    最近做需求发现,引入dispatch_after后,在dispatch_after执行期间会引起对象延迟释放 官网...

  • GCD中的dispatch_after使用说明

    dispatch_after解说 dispatch_after是来延迟执行的GCD方法,因为在主线程中我们不能用s...

  • iOS进阶之GCD-dispatch_after

    一:dispatch_after 二:NSObject中提供的线程延迟方法 三:通过NSTimer来延迟线程执行

  • GCD补充:

    dispatch_after 功能:延迟一段时间把一项任务提交到队列中执行,返回之后就不能取消,常用来在在主队列上...

  • GCD系列:dispatch_after, dispatch_a

    一、dispatch_after 功能:延迟一段时间把一项任务提交到队列中执行,返回之后就不能取消常用来在在主队列...

网友评论

    本文标题:dispatch_after的延迟执行怎么取消?

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