AFN同步請求

項目需求:
在 Block 中先發(fā)送網絡請求,得到結果后再將請求結果返回

解決思路:
用信號量是比較理想的解決方案,
但由于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);

//創(chuàng)建初始信號量
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;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容