Block - 4

经过前面几篇的学习我们大概对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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值