? ? ? ?AFNetworking 同步請求赔嚎?怎么會有這樣的設(shè)計~有時候確實存在這樣的情況和需求,哎硬著頭皮解決吧胧弛!
? ? ? ?之前寫過一篇使用NSURLSession同步獲取數(shù)據(jù)尤误,于是想到的也是使用信號量,代碼走起结缚,請求损晤,居然AF請求發(fā)出,沒有返回~死鎖了红竭?尤勋?喘落?
? ? ? 于是開始著手調(diào)研,參考網(wǎng)上提供的思路最冰,以及大神解答瘦棋,查看大神么的回復(fù)發(fā)現(xiàn),確實AF使用信號量會造成死鎖锌奴,造成死鎖的原因是AF默認(rèn)的回調(diào)都是在mainQueue上執(zhí)行的兽狭。而主線程因為dispatch_semaphore_wait的關(guān)系鎖死了,AF的回調(diào)需要等待主線程解鎖后才會繼續(xù)鹿蜀。箕慧。而解鎖的鑰匙卻在回調(diào)里。知道了原因可以還是不知道怎么解決茴恰,知道了思路就多了調(diào)查方向颠焦,繼續(xù)調(diào)查,終于在stackoverflow上找到了解決辦法往枣。將AF的回調(diào)隊列放到全局隊列(dispatch_get_global_queue)中伐庭,問題迎刃而解,將自己的成功記錄下來分冈,供以后參考圾另。具體實現(xiàn)直接上代碼:
- (id)sendForUrl:(NSURL *)url {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//關(guān)鍵的就是這句
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
__block id response;
[manager GET:url.absoluteString parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {
response = responseObject;
NSLog(@"JSON: %@", responseObject);
dispatch_semaphore_signal(semaphore);
} failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return response;
}
經(jīng)過測試,非常完美~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
也可使用別人對AF擴(kuò)展的同步請求AFNetworking-Synchronous? 本人沒有測試雕沉,不能保證
?語言&技術(shù)能力有限集乔,如有不恰當(dāng)?shù)牡胤綒g迎指正批評。
參考鏈接:
1:Wait for AFNetworking completion block before continuing (i.e. Synchronous)