簡介
目前在編寫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參數的函數,則就可以完成參數的傳遞工作。