AFN同步请求

项目需求:
在 Block 中先发送网络请求,得到结果后再将请求结果返回

解决思路:
用信号量是比较理想的解决方案,
但由于dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)
会阻塞主线程,而 AFNetworking 返回值的 Block 默认也是在主线程。

所以必须更改 AFHTTPSessionManager 的 completionQueue 为
dispatch_get_global_queue(0, DISPATCH_QUEUE_PRIORITY_HIGH)

dispatch_queue_t queue = dispatch_get_global_queue(0, DISPATCH_QUEUE_PRIORITY_HIGH);

//创建初始信号量
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
  
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.completionQueue = queue;
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:kAddress(@"/device/DevVR/uploadImg")
       parameters:@{@"image":imageStr}
         progress:nil
          success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
              
         NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
              
        if (![json isKindOfClass:[NSDictionary class]]) {
            MJAlert(@"温馨提示", @"网络异常,请稍后再试", @"确定", nil, nil);
            return  ;
         }
         NSDictionary *result = json[@"result"];
         if (![result isKindOfClass:[NSDictionary class]]) {
             MJAlert(@"温馨提示", @"网络异常,请稍后再试", @"确定", nil, nil);
             return ;
         }
        NSNumber *success = result[@"success"];
        if (![success isEqualToNumber:@0]) {
             MJAlert(@"温馨提示", result[@"msg"], @"确定", nil, nil);
             return ;
        }
   
//信号量+1
dispatch_semaphore_signal(sema);
              
          } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
 
 //信号量+1
 dispatch_semaphore_signal(sema);

          }];
    
 //阻塞主线程,等待信号量不为0   
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

//返回请求结果 
 return imaget;

你可能感兴趣的:(AFN同步请求)