美文网首页
iOS -Block的使用场景

iOS -Block的使用场景

作者: CDLOG | 来源:发表于2021-03-12 11:14 被阅读0次

    作用

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

    相关文章

      网友评论

          本文标题:iOS -Block的使用场景

          本文链接:https://www.haomeiwen.com/subject/fxnwqltx.html