iOS -Block的使用场景

2021-03-12  本文已影响0人  CDLOG

作用

保存一份代码,适当的时候再调用。
同一个类型(参数和返回值)的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);
}

上一篇下一篇

猜你喜欢

热点阅读