作用
保存一份代码,适当的时候再调用。
同一个类型(参数和返回值)的block是可以赋值的。
开发中是使用场景
1,将Block代码保存到对象,恰当的时机再调用(外部执行的某个方法后可以有回调也可以没有回调)。
2,Block当做方法的参数使用(外部是执行的某个方法后需要调用回调,那么Block可以作为参数),比如网络请求完成时,就需要回调,就是把方法执行和回调放在一起了,响应式编程主要就是利用这个特性。
3,Block作为方法的返回值,目的是为了代替方法。比如让[person eat]方法调用变成person.run()。让其他语言的开发者看着比较习惯,block里面就是方法的实现,block在内部实现。
快速模板定义
inlineBlock
1,简单定义和调用
void(^StudentBlock)(void) = ^(void) {
NSLog(@"111");
};
StudentBlock();
2,对象方法的回调
有两种声明方式。
//Person类的.h文件
//设置block别名,作为属性或者参数,都可以写这个。
typedef void(^RunBlock)(void);
@interface Person : NSObject
//两种写法
@property (nonatomic, strong) RunBlock runBlocK;
@property (nonatomic, strong) void(^RnBlock)(void);
-(void)run;
@end
//Person类的.m文件
@implementation Person
-(void)run{
if(self.runBlocK){
self.runBlocK();
}
if (self.RnBlock) {
self.RnBlock();
}
}
@end
//控制器调用
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_per = [[Person alloc]init];
_per.runBlocK = ^{
NSLog(@"111");
};
_per.RnBlock = ^{
NSLog(@"222");
};
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[_per run];
}
@end
3,当做方法的参数使用
主要适用于方法执行后,需要回调的情况,把方法的执行和回调放一起。
block的参数
可以为方法block的回调传递数据。
书写格式函数名:(block类型)block名。
block类型:(返回值)(^)(参数值)
//.h
-(void)eat:(void(^)(NSString *food))eatBlock;
//.m
-(void)eat:(void(^)(NSString *food))eatBlock{
eatBlock(@"水果");
}
//调用
[_per eat:^(NSString * _Nonnull food) {
NSLog(@"吃了%@",food);
}];
4,Block作为方法的返回值,代替方法。
block的参数作为方法的参数。
//.h
-(void(^)(NSInteger meter))rrun;
//.m
-(void(^)(NSInteger meter))rrun{
return ^(NSInteger meter){
NSLog(@"跑了%ld米",(long)meter);
};
}
//调用
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
_per.rrun(2);
}