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...
    肇東周閱讀 12,251評論 4 61
  • 前兩年,我們過年不陪父母看電視,是因為在搶紅包、玩手游、和朋友談天說地。 這兩年,我們平日不陪寶寶玩游戲,是因為在...
    兜兜簡書閱讀 135評論 0 0
  • 要想深入理解Handler機制,就要理解: Android為何要引入Handler機制? Handler機制究竟是...
    劍舞瀟湘閱讀 1,183評論 2 6
  • 在現代生活中,哲學家差不多是世界上最受人尊崇,同時也最不受人注意的家伙,如果這么一個家伙真的存在著的話。“哲學家”...
    簡書茶館葉老板閱讀 2,433評論 5 27
  • raftraft video
    myang199088閱讀 282評論 1 2