Block基本语法结构
- 定义:
- 一般形式:
返回值类型 (^block名称)(参数列表) = ^返回值类型(参数列表) { // 代码块内容 };
- 例如定义一个简单的Block,计算两个整数的和:
int (^sumBlock)(int, int) = ^int(int a, int b) {
return a + b;
};
- 调用:按照函数调用的方式调用定义好的Block,例如上述
sumBlock
的调用:
int result = sumBlock(3, 5);
NSLog(@"结果: %d", result);
- 简化形式:
- 当返回值类型可以由编译器推断时,可以省略返回值类型,如:
int (^sumBlock)(int, int) = ^(int a, int b) {
return a + b;
};
- 如果Block没有参数,参数列表可以为空
()
,例如:
void (^printHelloBlock)() = ^{
NSLog(@"Hello");
};
printHelloBlock();
Block在实际开发中的常见用途
- 作为函数参数:在很多系统API中被广泛使用,例如
dispatch_async
函数用于在后台队列执行任务,它接收一个Block作为要执行的任务。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
// 这里是在后台队列执行的代码
NSLog(@"在后台队列执行任务");
});
- 事件处理:在视图控制器中,用于处理按钮点击等事件。例如,在创建一个按钮时,可以直接将点击处理逻辑写在Block中。
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:@"点击我" forState:UIControlStateNormal];
[button addTarget:self action:nil forControlEvents:UIControlEventTouchUpInside];
[button setBlock:^(id sender) {
NSLog(@"按钮被点击了");
}];
- 集合遍历:
NSArray
和NSDictionary
等集合类有支持使用Block进行遍历的方法。例如,遍历数组:
NSArray *numbers = @[@1, @2, @3];
[numbers enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"数组元素: %@", obj);
if (idx == 1) {
*stop = YES; // 停止遍历
}
}];
- 延迟执行:使用
dispatch_after
函数结合Block可以实现延迟执行任务。
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSLog(@"延迟2秒执行");
});