AFNetworking3.0以后,都是异步的请求,之前的同步请求的接口已经废弃了。
如下是一个3.0请求的Get方法:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
有时候我们却还是需要这同步请求,单次的请求依赖倒是没有问题,可以在Block中依次执行,但是有时候是对多次请求的依赖,这时候是无法直接在Block中简单实现的,这时就迫切需要同步请求的功能。
下面是我实现的一个方法,不一定是最优的,但是我认为可以满足大部分程序场景的需求。
同步请求的实现方法:
具体的实现是,通过信号量来控制,Code如下:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //创建信号量
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
dispatch_semaphore_signal(semaphore);//不管请求状态是什么,都得发送信号,否则会一直卡着进程
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
dispatch_semaphore_signal(semaphore);//不管请求状态是什么,都得发送信号,否则会一直卡着进程
}];
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER); //等待
希望对大家有帮助。