通过闭包回调传递参数
//completion是有参数,无返回值的闭包
func loadData(completion: @escaping (_ result: [String]) -> ()) -> () {
//将任务添加到队列,指定执行任务的函数。解释:队列调度任务(block或闭包),以同步或异步的方式执行
DispatchQueue.global().async {
print("耗时操作,网络数据请求中\(Thread.current)")
//休眠
Thread.sleep(forTimeInterval: 3)
//模拟获取结果
let json = ["头条","八卦","出大事了"]
//主队列
DispatchQueue.main.async {
print("主线程更新UI\(Thread.current)")
//回调,执行闭包(通过传递的参数)
//传递异步获取的结果json
completion(json)
}
}
}
外部的调用形式
//注意这是一个尾随闭包
loadData { (result) in
print("获取的数据\(result)")
}
关于尾随闭包,说明上面的调用形式实际上是一个尾随闭包。如果函数的最后一个参数是闭包,函数参数可以提前结束,最后一个参数直接使用{}包装闭包的代码。上面这个尾随闭包原本有自己的闭包书写形式,但是当处于代码最后的时候,为了更便于读懂,所以会有尾随闭包的写法,这种尾随闭包的写法让代码更衣读懂。
//尾随闭包的写法
loadData { (result) in
print("获取的数据\(result)")
}
//原始形式的写法
loadData(completion: {(result: [String]) -> () in
print("获取的数据\(result)")
})