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;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。