swift语法--12-1闭包基本概念
block和闭包区别
-
OC:
- block类似于匿名函数, 用于封装代码块, 在特殊的时候执行
- 执行一些耗时操作,用于回调
- 类型: 返回值类型(^block名称)(形参列表)
- 值:
^(形参列表){ 需要执行的代码 }
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self loadData:^{
//3.主线程刷新UI
NSLog(@"更能UI");
}];
}
- (void)loadData:(void(^)())finished
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//1.子线程加载数据
NSLog(@"%@", [NSThread currentThread]);
NSLog(@"加载数据");
dispatch_async(dispatch_get_main_queue(), ^{
//2.主线程回调
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", [NSThread currentThread]);
finished();
});
});
});
}
-
Swift:
- 闭包是用于定义函数(Swift中函数就是闭包, 闭包就是一个特殊的函数)
- 执行一些耗时操作,用于回调
- 类型: (形参列表)->返回值类型
- 值:
{ (形参列表)->返回值类型 in 需要执行的代码 }
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
loadData { () -> () in
//3.在主线程更新UI
print("更新UI")
}
}
func loadData(finished: ()->())
{
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
//1.子线程下载数据
print(NSThread.currentThread())
print("加载数据")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//2.加载完数据,主线程回调
print(NSThread.currentThread())
finished()
})
}
}
闭包的几种格式
1. 完整写法
loadData ({ () -> () in
print("更新UI")
})
//in是用于区分代码和描述
2. 如果闭包没有形参, 那么in和in之前的代码都可以省略
loadData ({
print("更新UI")
})
3. 如果闭包是函数的最后一个参数, 那么闭包可以写在函数()的后面
loadData (){
print("更新UI")
}
4. 如果函数只有一个闭包参数, 那么函数的()可以省略
loadData {
print("更新UI")
}
网友评论