美文网首页#iOS#HeminWon
typedef 和作为属性的block以及多个block之间的混

typedef 和作为属性的block以及多个block之间的混

作者: 陈长见 | 来源:发表于2016-01-19 10:48 被阅读851次

    如果单纯的写一个block来保存代码, 在开发中往往比较麻烦,尤其我们在很多地方都想要用到这个block的时候更是冗杂, 所以很多时候我们都typedef或者把block作为属性,这样的话使用起来会非常方便

    一: 示例

    typedef void (^RefreshPeripheralData)(NSMutableArray *allMachines,BOOL isFirst);//刷新数据回调
    
    typedef void (^disConnectFinish)(RefreshPeripheralData finishBlock,NSError *error);//手动断开连接回调
    
    @interface BleCentralManager : NSObject
    
    @property (copy,nonatomic)RefreshPeripheralData 
    didRefresh;
    
    @property (copy,nonatomic)disConnectFinish disConnectFinish;//手动断开连接回调
    @end
    
    • 1:
    ```表示定义一个接收allMachines数组和BOOL类型isFirst两个参数的并且无返回值的block, block类型为RefreshPeripheralData
    
    + 2: 
    

    typedef void (^disConnectFinish)(RefreshPeripheralData finishBlock,NSError *error);

    
    + 3:
    ```@property (copy,nonatomic)RefreshPeripheralData 
    didRefresh;
    ```表示定义了一个RefreshPeripheralData类型的属性didRefresh这个block
    当然didRefresh是RefreshPeripheralData类型的,也就意味着,在使用时,didRefresh同样需要接收两个参数
    
    + 4:
    ```@property(copy,nonatomic)disConnectFinish disConnectFinish;
    ``` 与示例3同理,disConnectFinish是一个block,当然也可以定义一个属性,当然这个重新定义的block因为是disConnectFinish类型的,与示例3不同的是,他接收的两个参数中,有一个也同样是block
    
    ###二: 使用范例
    
    + 1:
    didRefresh 的使用范例
    ```objc
    if(self.didRefresh)
    {
        self.didRefresh(self.allMachines,NO);
    }
    

    这里的```self.didRefresh(self.allMachines,NO);

    
    + 2: 
    disConnectFinish 的使用范例
    ```objc
    if (self.disConnectFinish)
     {
         self.disConnectFinish(self.didRefresh,erro);
    }
    

    上面已经有讲解,不再多说, 接收self.didRefresh这个block 作为参数

    • 3:
      两个block在一个方法中的混合使用范例:
    • 1: 定义一个方法其中finish参数为disConnectFinish 这个block
    -(void)disconnectIndex:(MachineModel *)model finish:(disConnectFinish)finish{//断开连接
        if (finish) {
            self.disConnectFinish = finish;
        }
    }
        ```
    如果当使用时,传入的block有值,也就是说finish有值的话,就会执行```self.disConnectFinish = finish```这个方法
     - 2: 当使用时调用
    ```objc
    [self disconnectIndex:self.machineModel finish:^(RefreshPeripheralData finishBlock, NSError *error) {
                [SVProgressHUD dismiss];
           
            }];
    

    因为之前定义时,finish参数为disConnectFinish类型的block,所以在使用时,finish也就传入^(RefreshPeripheralData finishBlock, NSError *error)
    这样, 一个方法中就混合了两个block的使用

    三: block的使用注意点

    如果在block中要修改外面属性的值的时候, 要在其前面加上__block,当然弱指针的self在实际开发中怎样使用也需要注意

    相关文章

      网友评论

        本文标题:typedef 和作为属性的block以及多个block之间的混

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