函数+Block封装用Block作回调的函数

2016年06月22日星期三

有时候,我们在想封装一个带有block回调的函数,比如常用的AFNetworking,或者Alomfire(名字如果错了,不要在意),就会有个小问题,函数是不能通过block返回任何参数的。可以这么理解(至少我现在是这么想的):函数,是同步执行的,它在执行的时候是不会停下来的。block却不是这样的,block相当于是异步执行,另外开一个线程去搞这个事情。所以,这就有个问题,当你想封装带block的函数,并且获取到他的block内的参数,用函数是没有办法的。函数已经执行完毕并且被内存释放掉了,你block才把回调传过来,这么写,xcode就会提醒你是不行的。

但是,在看同事代码的时候,我非常惊喜的发现(MDZZ)可以在函数后面跟一个或者几个block,然后在函数内部,给函数的block赋予内部封装的block的值。 具体的实现可以参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
-(void)MMhttpService:(NSString *)url parame:(NSDictionary *)parame success:(void (^)(id))success fail:(void (^)(id))failuer{
AFHTTPSessionManager *manage = [AFHTTPSessionManager manager];
manage.requestSerializer.timeoutInterval = 10.0f;//设置10秒后就爆炸
[manage POST:url parameters:parame progress:^(NSProgress * _Nonnull uploadProgress) {
//tudo
NSLog(@"这里执行的是progress 代码块");
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//通过这个方式,来进行封装block的参数外传
success(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failuer(error);
}];
}

实现的时候就是这个牛🐂样

1
2
3
4
5
6
MM_NetWorking *mm = [[MM_NetWorking alloc]init];
[mm MMhttpService:@"url" parame:@{} success:^(id response) {
NSLog(@"这是成功的咯%@",response);
} fail:^(id error) {
NSLog(@"这是失败的咯%@",error);
}];

完美!

评论