天天看點

編寫帶有block參數的函數

簡介

目前在編寫IOS程式的過程中,對于block的使用比較多。一般都是使用iOS寫好的API自帶的block,但是自己也想寫一些block作為參數的函數。如果是在同一個類中,可以異步編寫一些代碼。如果是在不同的類中,則可以這些資料的傳遞。但是當把block作為函數參數的時候,如何編寫這樣的函數一直不知所雲,這幾天有空就研究了一下,下面通過幾個例子來說明一下。

不帶參數的block

例如 想在某個方法結束後調用另外一個方法

-(void)blockDemo1:(void(^)() )completion{ NSLog(@"this is a no-param block"); if(completion) completion(); }

//如果想在blockDeom1這個函數調用結束後調用另外一個函數,例如調用函數afterCompletion,則可以這樣進行調用

//afterCompletion

-(void)afterCompletion{ NSLog(@"afterCompletion"); }

//調用

[self blockDemo1:^{ [self afterCompletion]; }

輸出結果

14:24:42.892 blockParamDemo[1519:100012] this is a no-param block

14:24:42.892 blockParamDemo[1519:100012] afterCompetion

在這個例子中block函數completion的實作就是在調用afterCompletion,就是說block函數代碼的實作是在調用它所在的函數的時候才實作。在block函數做為參數的時候,它隻是個參數,就像其他參數一樣使用。隻是如果block函數帶有參數的話,就可以向這個block函數傳參,這個是和其實參數不一樣的地方。下面就寫一個帶有參數的例子。

帶參數的例子

//根據code值不同,向block輸入不同的值。block可以根據這些不同的值在調用blockDemo2的時候實作不同的功能

-(void)blockDeom2:(void(^)(NSString*,NSString* ))block codeName:(int) code{ switch (code) { case 1: if (block) { block(@"test1",@"error1"); } break; case 2: if (block) { block(@"test2",@"error2"); } break; default: if (block) { block(nil,nil); } break; } }

//調用這個函數

[self blockDeom2:^(NSString *error_code, NSString *error){ if (error) { NSLog(@"error_code is %@",error_code); }else{ NSLog(@"error is nil"); } } codeName:2];

輸出結果

15:00:14.998 blockParamDemo[1678:121030] error_code is test2

如果在不同的類之間調用帶block參數的函數,則就可以完成參數的傳遞工作。