基本使用
// 将任务添加到队列,队列调度任务,以同步/异步的方式执行
DispatchQueue.global().async {
// 异步处理耗时操作
print(Thread.current) // 输出:<NSThread: 0x600000d30c40>{number = 8, name = (null)}
DispatchQueue.main.async {
// 主线程回调
print(Thread.current) // 输出:<NSThread: 0x600000d6ad80>{number = 1, name = main}
}
}
DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
[weak self] in
ScreenUIManager.sv_dismiss()
DispatchQueue.main.async {
}
}
在方法中直接将闭包做参数传递时,异步中调用闭包completion(data)会报错(Escaping closure captures non-escaping parameter 'result')
func ascTask(completion: (_ result: [String: Any])->()) -> () {
DispatchQueue.global().async {
let data = ["title":"标题","content":"内容"]
DispatchQueue.main.async {
// 使用下面这句代码会报错:Escaping closure captures non-escaping parameter 'result'
completion(data)
}
}
}
解决这个问题
typealias completionBlock = ([String: Any])->()
func demo() {
// 异步执行闭包回调
ascTask { (result) in
print(result)
}
}
/*
在异步中执行任务,通过主线程回调
闭包的应用场景和block一样
*/
func ascTask(completion: @escaping completionBlock) -> () {
DispatchQueue.global().async {
// 异步处理耗时操作
// 睡眠2秒
Thread.sleep(forTimeInterval: 2)
// 获得数据
let data = ["title":"标题","content":"内容"]
DispatchQueue.main.async {
// 主线程回调
completion(data)
}
}
}