GCD 和延时调用

// GCD 和延时调用

DispatchQueue.global().async {

print("耗时的。。。努力工作")

//

DispatchQueue.main.async {

print("结束工作,更新 UI")

}

}

/*

要实现以下功能

delay(2){

print("2秒输出")

}

想取消的话,保留一个 task 的引用,然后调用 cancel

let task = delay(5) {

print("拨打110")

}

仔细想了想,还是取消为妙

cancel(task)

*/

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

// 延时执行一个block, 返回这个一个可以取消的block

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(5) {

print("拨打110")

}

cancel(task)

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

推荐阅读更多精彩内容

  • let time: TimeInterval = 1.0 DispatchQueue.main.asyncAfte...
    歌手的剑阅读 1,525评论 0 0
  • 在向队列中添加任务时,可以直接在对应的函数中添加 block。但是如果想对任务进行操作,比如监听任务、取消任务,就...
    fuyoufang阅读 9,036评论 3 23
  • 主要总结一些平时遇到的疑难点,在此总结出来,持续更新。可能有些误导大家的地方,欢迎指正。 难点 get,set,w...
    Jimmy木阅读 2,631评论 1 10
  • 以下翻译自Apple官方文档,结合自己的理解记录下来。翻译基于 swift 3.0.1 原文地址 Closure...
    艺术农阅读 1,617评论 0 3
  • 每天工作没有激情,培养爱好又觉得好难。健身一定要找私教吗?感觉健身不像学习,自己在那里捣鼓总出不了效果……很是惆怅...
    小胖友要学习阅读 238评论 0 0