如果單純的寫一個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在實際開發中怎樣使用也需要注意