您的当前位置:首页正文

Block的三种使用场景

来源:华拓网

iOS block介绍

block因其古怪的语法结构所以看上去比较蛋疼,比较难记,还好工作中忘记怎么写了是有技巧的等下会说,block的所用就是帮你保存一份代码然后再恰当的时候调用,返回你所需要的“值”(没想到词,就用它吧,对block做了以下总结,做下笔记

如何声明及实现一个block 看图

忘记写法可以试试.png
定义无返回值 无参数的block
    //  无返回值  无参数
    void(^block01)() = ^(){
        
        NSLog(@"01-无返回值  无参数的block");
    };
    
    block01();
定义无返回值 有参数的block
    //  无返回值  有参数(int 类型)
    void(^block02)(int) = ^(int age){
      
        NSLog(@"%d",age);
    };
    
    //  传入一个参数
    block02(20);
定义有返回值有参数的block
    //   有返回值  有参数
    int(^block03)(int) = ^(int num){
     
        NSLog(@"03-有返回值  有参数的block  num:%d",num);
        
        return 100;
    };
    
   int temp = block03(200);
    
    NSLog(@"03-有返回值  有参数的block temp:%d",temp);

打印结果都在这里了

打印结果.png

好 开始介绍第一种block 把一段block代码当做**对象的属性值 以Person类为例

以operAtion(操作)为属性

定义属性
Paste_Image.png
    //  开发中第一种使用场景  将block保存到对象中
 
    self.p.operAtion = ^(){
        NSLog(@"02-将block当做属性值保存起来");
    };
    
    
    //  第二种写法
    void(^block03)() =^(){
    
        NSLog(@"03-将block当做属性值保存起来");
    };

    self.p.operAtion = block03;
在你认为合适的时刻调用这个属性 也就是封装的这段block代码
Paste_Image.png

第二种block 把block当做方法的参数 也是最常用的写法

定义一个带有block的函数


Paste_Image.png

实现这个函数

/**
 *  实现方法
 *
 *  @param block  在方法内部调用block
 */
-(void)eat:(void (^)(int))block{

    NSLog(@"此处可封装N多代码  返回值可通过block的参数回调到外界   此处以 int 为例");
    
    block(5);
}

外界调用这个方法

    //  开发中第二种使用场景  将block作为方法的参数  在方法内部调用这个block
    Person *p = [[Person alloc]init];
    
    [p eat:^(int count){
        NSLog(@"吃了%d个馒头",count);
    }];
Paste_Image.png

第三种block 把block当做方法的返回值 符合链式编程思想

定义这个方法
Paste_Image.png
实现这个方法
Paste_Image.png
外界调用
Paste_Image.png
打印结果
Paste_Image.png