美文网首页iOS-多线程
Swift GCD中取消一个正在执行的Block

Swift GCD中取消一个正在执行的Block

作者: TomatosX | 来源:发表于2017-08-07 11:48 被阅读190次

Swift GCD中没有原生支持取消等的操作,这些操作就需要我们自己动手去实现。

Playground中想要支持异步,需要将needsIndefiniteExecution参数设置为true

import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

下面就是取消block的demo:

typealias Task = (_ cancel: Bool) -> Void

func delay(_ time: TimeInterval, task: @escaping () -> ()) -> Task? {
    
    func dispatch_later(block: @escaping () -> ()) {
        let t = DispatchTime.now() + time
        DispatchQueue.main.asyncAfter(deadline: t, execute: block)
    }
    
    var closure: (() -> Void)? = task
    var result: Task?
    
    let delayedClosure: Task = { cancel in
        
        if let internalClosure = closure {
            if (cancel == false) {
                DispatchQueue.main.async(execute: internalClosure)
            }
        }
        closure = nil
        result = nil
    }
    
    result = delayedClosure
    dispatch_later {
        if let delayedClosure = result {
            delayedClosure(false)
        }
    }
    
    return result
}

func cancel(_ task: Task?) {
    task?(true)
}

let task = delay(2) { print("两秒后输出") }

参考:

相关文章

  • 使用GCD实现Delay Call的取消操作

    取消任务在OC当中是NSOperation的专利,现在Swift的GCD也支持取消正在等待执行的Block操作了,...

  • Swift GCD中取消一个正在执行的Block

    Swift GCD中没有原生支持取消等的操作,这些操作就需要我们自己动手去实现。 在Playground中想要支持...

  • 如何在GCD队列中停止、取消、挂起、重新开始任务

    上周五在面试的时候被面试官问到一个问题:在Swift 3中如何取消一个正在执行的GCD线程?因为我使用Swift的...

  • GCD取消未执行的block

    参考博客:https://www.cnblogs.com/beckwang0912/p/7136862.html ...

  • 高级iOS面试题全纪录

    iOS基础: 多线程使用,gcd跟operation区别,怎么取消正在执行的gcd任务 GCD 系列知识总结 NS...

  • iOS GCD

    GCD原生并不支持取消操作。dispatch_suspend函数也只能暂停开启新的未执行的block,已经处于执行...

  • iOS多线程之GCD

    1. GCD相关概念 任务:就是执行操作的意思,就是你在线程中执行的那段代码。在 GCD 中是放在 block...

  • iOS: GCD详尽总结

    GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行。gcd中...

  • GCD

    GCD 任务:就是执行操作的意思,换句话说就是你在线程中执行的那段代码。在 GCD 中是放在 block 中的。执...

  • iOS多线程-串行队列

    GCD 串行队列 GCD核心概念:将任务添加对象,指定任务执行的方法 任务使用block封装block就是一个提前...

网友评论

    本文标题:Swift GCD中取消一个正在执行的Block

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