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