如果单纯的写一个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在实际开发中怎样使用也需要注意