1. 空传参数,无返回值
//block /闭包的应用场景
//通常用在异步加载网络数据,完成回调
func loadData(finished: @escaping () -> ()){
//以不能使用
//dispatch_async(dispatch_get_global_queue(0, 0)) {
//}
DispatchQueue.global().async {
print("耗时操作 \(Thread.current)")
//通常加载数据...
//异步完成之后,通过 block 回调
DispatchQueue.main.async {
print("完成 \(Thread.current)")
//执行 finished 回调
finished()
}
}
}
//调用方法
loadData {
print("回调执行代码")
}
2. 无传惨,有返回值
//block /闭包的应用场景
//通常用在异步加载网络数据,完成回调 -> 以 参数 的形式 传递网络获取的数据
func loadData2(finished: @escaping (_ html:String) -> ()){
//以不能使用
//dispatch_async(dispatch_get_global_queue(0, 0)) {
//}
DispatchQueue.global().async {
print("耗时操作 \(Thread.current)")
//通常加载数据...
//异步完成之后,通过 block 回调
DispatchQueue.main.async {
print("完成 \(Thread.current)")
//执行 finished 回调
finished("<html><html>")
}
}
}
//调用方法
loadData2 { html in
print("完成回调 \(html)")
}
3. OC 中block使用,无传参,有返回值
//实现方法
-(void)loadData:(void(^)(NSString *html)) finished{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"耗时操作 %@",NSThread.currentThread);
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"主线程完成 %@", NSThread.currentThread);
//执行回调
finished(@"<html></html");
});
});
}
//调用方法
[self loadData:^(NSString *html) {
NSLog(@"回调执行 %@",html);
}];
4. ‘尾’随闭包
//1.闭包参数是函数的最后一个参数 -> 末尾
//2.函数的 )结束,可以省略
//3.简化闭包,如果没有参数,没有返回值,可以省略
func loadData3(){
DispatchQueue.global().async {
print("One \(Thread.current)")
DispatchQueue.main.async {
print("One 主线程")
}
}
DispatchQueue.global().async(execute: {() -> Void in
print("Two \(Thread.current)")
DispatchQueue.main.async(execute: {() -> Void in
print("Two 主线程")
})
})
}