经过前面几篇的学习我们大概对iOS下的block的理解有所印象,但是实际使用中还是更为复杂一些,下面用AFNetworking平台为例子演示一遍。
1.回调block typedef 声明:
typedef void (^CallBack)(id object);
上传照片的方法,回调block作为参数:
-(void)requestUploadAppealImageWith:(NSMutableDictionary *)dic andImageDataDic:(NSMutableDictionary *)dataDic andURL:(NSString *)url andCallBack:(CallBack)callback
{
AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
NSData* dData = [dataDic objectForKey:@"D"];
NSData* iData = [dataDic objectForKey:@"I"];
NSData* cData = [dataDic objectForKey:@"C"];
[manager POST:url parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> formData){
[formData appendPartWithFileData:dData name:@"D" fileName:@"image.jpg" mimeType:@"multipart/form-data"];
[formData appendPartWithFileData:iData name:@"I" fileName:@"image.jpg" mimeType:@"multipart/form-data"];
[formData appendPartWithFileData:cData name:@"C" fileName:@"image.jpg" mimeType:@"multipart/form-data"];
}
success:^(AFHTTPRequestOperation* operation, id responseObject){
callback(responseObject);
}
failure:^(AFHTTPRequestOperation* operation, NSError* error){
//这里记得一下, "网络异常" 这个NSString类型,下面会明白为什么叫做回调!
callback(@"网络异常");
}];
}
而方法里面调用的是AFNetworking的方法也是用了block作为参数:
- (AFHTTPRequestOperation *)POST:(NSString *)URLString
parameters:(id)parameters
constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
NSError *serializationError = nil;
NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError];
if (serializationError) {
if (failure) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu"
dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
failure(nil, serializationError);
});
#pragma clang diagnostic pop
}
return nil;
}
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];
[self.operationQueue addOperation:operation];
return operation;
}
以上是定义方法,下面是方法使用:
//主线称调用
dispatch_async(dispatch_get_global_queue
(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
//这里block作为参数回调
[[SPHTTPRequest shareSPHTTPRequest] requestUploadAppealImageWith:dict andImageDataDic:imageDic
andURL:APPEALIMG_IP andCallBack:^(id object){
<span style="white-space:pre"> </span> //这里的判断NSString类型其实就是上面的 "网络错误" , 明白回调了吧!
if ([object isKindOfClass:[NSString class]])
{
[MBProgressHUD hideAllHUDsForView:self.navigationController.view animated:YES];
[SPCustomAction alertWithMsg:@"网络错误" andTime:1];
}
else
{
self.responseDic = [SPParse parseAppealUpLoadPublicserviceWithData:object];
if ([self.responseDic.flag intValue] == 0)
{
}
else if ([self.responseDic.flag intValue] == 1)
{
}
[MBProgressHUD hideAllHUDsForView:self.navigationController.view animated:YES];
[SPCustomAction alertWithMsg:@"上传成功" andTime:1];
[self.navigationController popToRootViewControllerAnimated:YES];
}
}];
});
永远记得,block什么时候为参数,什么时候为定义,什么时候为实现就能理解了。
别的都一样,一通百通!