由于AFNetworking没有对网络同步请求进行封装,而又在使用中偶尔会用到,我是这种进行处理的,分享出来,希望大家有更好的建议。
dispatch_semaphore_tsemaphore =dispatch_semaphore_create(0);//创建一个信号量
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithUrlString:url];
[manager POST:urlString parameters:dic progress:nil success:^(NSURLSessionDataTask*_Nonnulltask,id_NullableresponseObject) {
//处理代码
//在处理完成后发送信号量
dispatch_semaphore_signal(semaphore);
}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror) {
//处理代码
//dispatch_semaphore_signal(semaphore);
}];
//信号量等待
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);
因为AFNetworking成功和失败的回调是在主线程进行的,如果在主线程进行这种方法的调用会造成死锁,只能在其他线程进行处理。
void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
在串行队列和全局队列中的作用只是dispatch_async的作用,只有在 dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
这样的队列中才能起到同步作用。