*本文参考了《Objective-C高级编程 iOS与OSX多线程和内存管理》一书,关于Block的介绍摘取自此书。
Objective-c 语言中Block语法格式为:
返回值类型 参数列表 表达式
c语言中的函数语法格式为
返回值类型 函数方法名 参数列表 表达式
从上面的语法可以看出,完整的Block与一般C语言函数定义相比,仅有两点不同:
(1)没有函数名
(2)带有"^”符号
以下是一个完整的Block示例:
^int (int count){return count + 1;}
^(int count){return count + 1;}
另外,如果Block不带参数,则参数列表也可省略,如:
^void (void){printf("Blocks\n");}
可以写成
^{printf("Blocks\n");}
2.block类型变量
在Block语法下,可将Block语法赋值给声明为Block类型的变量中,声明Block类型变量的示例如下:
int (^blk)(int);
使用Block语法将Block赋值为Block类型的变量:
int (^blk)(int) = ^(int count){return count+1;};
因为Block类型的变量与通常的变量相同,所以也可以将Block类型变量赋值给Block类型变量:
int (^blk1)(int) = blk
也可以:
int (^blk2)(int);
blk2 = blk1;
void func(int (^blk)(int)){}
另外,可以使用typedef来简化代码,如通过typedef声明blk_t类型变量:
typedef int (^blk_t)(int);
实例:封装一个通用的网络请求函数(action为请求的方法名,parmeters为参数,请求成功获得到json数据)
伪代码如下:
typedef void(^ Failure)();
typedef void(^Success)(NSDictionary *dic);
#pragma mark - 网络操作
- (void)createAsynchronousRequest:(NSString *)action parmeters:(NSDictionary *)parmeters success:(Success)success failure:(Failure)failure {
if(请求成功)
success(responseObject);
else{
failure();
}
}
使用方法如下:
[self createAsynchronousRequest:LogInAction parmeters:parameters success:^(NSDictionary *dic){
//请求成功后在这里处理
} failure:^{
//请求失败后在这里处理
}];