由于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);
這樣的隊列中才能起到同步作用。