項目需求:
在 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;