Block - 4

来源:互联网 发布:linux内核编译步骤 编辑:程序博客网 时间:2024/05/29 15:10

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

别的都一样,一通百通!


0 0
原创粉丝点击