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

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("两秒后输出") }

参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,194评论 4 61
  • 前两年,我们过年不陪父母看电视,是因为在抢红包、玩手游、和朋友谈天说地。 这两年,我们平日不陪宝宝玩游戏,是因为在...
    兜兜简书阅读 936评论 0 0
  • 要想深入理解Handler机制,就要理解: Android为何要引入Handler机制? Handler机制究竟是...
    剑舞潇湘阅读 4,865评论 2 6
  • 在现代生活中,哲学家差不多是世界上最受人尊崇,同时也最不受人注意的家伙,如果这么一个家伙真的存在着的话。“哲学家”...
    简书茶馆叶老板阅读 7,022评论 5 27
  • raftraft video
    myang199088阅读 1,865评论 1 2