因為最近都在緊鑼密鼓的學習H5,iOS原生的知識有些生疏了,導致一個朋友問我一些技術問題時,寫個方法block拼接了半天沒寫出來,好生尷尬,寫這個文章重點來回憶記錄下Block一些在代碼中的常用寫法,既提醒自己練練手感,也給那些不常用Block的童鞋一些參考??偠灾?,Block還是很還用的,
- 一句話:代碼簡潔 有逼格!
Block 有3種常用的寫法,如下
1.屬性流@property (nonatomic,copy) void(^myblock)(int);
2.typedef 定義Block類型流
typedef void(^responseBlock)(NSDictionary * response,BOOL success);
3.直接擼流 (不用申明規范 直接寫)
- (void)haveFunWithBlock:(void(^)(NSMutableDictionary * dic,BOOL success))funBlock
第一種Block是最簡單的 直接申明個block變量 一般可以和普通的屬性一樣用作正向傳值 這個用的比較少。反正我是沒怎么用過。
第二種 這個在項目中用的比較多,特別是在用到一些需要重復使用的Block類型時 我們會經常用到,舉個例子,我需要一個返回字典和是否成功的回調,這個回調可能會多次使用,那么我就可以這么寫
typedef void(^responseBlock)(NSDictionary * response,BOOL success);
這里一般的用的少的童鞋 會以為responseBlock 是這個block的名稱,其實它只是一個類型,定義一個回調 字典和Bool值的block類型名稱而已,具體在代碼中的用法
{
NSLog(@"加載完網絡后主動調用");
NSDictionary *dic = [NSDictionary dictionary];
response(dic,1);
}
這里的response 才是這個block的名字,當然你也可以在
@property (nonatomic,copy) finishBlock block1;
屬性申明中,聲明一個finishiBlock類型的 名字叫block1的 block屬性,是不是有點繞口~哈哈哈哈
記得將 - (void)whenfinishloadNetWork:(responseBlock)response;放到.h中方便調用,這樣在別的類中,你要獲取response的值只需要實例化對應的類 然后:
[vc whenfinishloadNetWork:^(NSMutableDictionary *response, BOOL success) {
if (success) {
NSLog(@"hayo%@",response);
}
}];
其實就包含了一種思想在里面,別人不需要知道你其中的實現方式,別人只關心結果,具體的實現 你去做,我只拿結果。
- 第三種,平時應該用的是最多的同個類中代碼塊間傳值,這個可以讓功能模塊更清晰,哪段代碼是做什么用的,哪段代碼執行完后 再執行什么代碼,按邏輯分塊進行,即保證每塊代碼具有它應有的邏輯思維,不會造成某個功能模塊過于臃腫,又具有對應的代碼美感。
如:
- (void)whenfinishloadNetWork:(responseBlock)response
{
NSLog(@"確保網絡正常的回調");
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
response(dic,1);
}
- (void)haveFunWithBlock:(void(^)(NSMutableDictionary * dic,BOOL success))funBlock{
NSLog(@"在網絡正常的情況下,通過一段 激烈的運算后 我們得出了已個值是100 現在 要到用這個值的地方go");
NSMutableDictionary * dic =[NSMutableDictionary dictionary];
[dic setObject:@"100" forKey:@"haha"];
funBlock(dic,1);
}
[self whenfinishloadNetWork:^(NSMutableDictionary *response, BOOL success) {
// 確保網絡正常的情況下 拿到回調Success再去請求對應數據
if (success) {
[self haveFunWithBlock:^(NSMutableDictionary *dic, BOOL success) {
if (success) {
// response 即最終需要的獲取到的數據
NSLog(@"%@",response); //
}
}];
}
}];
簡單的block層疊關系,其實這就是說的block塊 它就是把一段代碼封裝成一個塊,別人要用到這個塊所產生的結果時,直接掉這個block,即可拿到想要的值。
可以有意識的去改造自己的代碼,完成后你會發現原來提升代碼bige 也挺簡單的。