您的位置:首页 > 移动开发 > IOS开发

Block - 4

2015-10-20 14:27 483 查看
经过前面几篇的学习我们大概对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什么时候为参数,什么时候为定义,什么时候为实现就能理解了。

别的都一样,一通百通!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS block