如果我們常用AFNetworking來請求數(shù)據(jù),可能會碰到在一個頁面里面的同時進(jìn)行多個網(wǎng)絡(luò)請求但是是順序執(zhí)行,我們要求執(zhí)行完畢我們可以依次取出數(shù)據(jù),進(jìn)而對整個請求隊列進(jìn)行監(jiān)聽,之前也碰到這個問題,最近研究一下,或許一下這些可以給你解決的辦法,或者你有更好的,歡迎探討
備注:AFNetworking -2.6.3
其實(shí)有兩種解決辦法:
1.假如我們用基于`AFHTTPRequestOperation`的封裝來建立網(wǎng)絡(luò)請求,那么很簡單,新建個NSOperationQueue設(shè)置maxConcurrentOperationCount就行了.
2,如果我們用AFHTTPRequestOperationManager來建立網(wǎng)絡(luò)請求(其實(shí)這個也是用AFHTTPRequestOperation)封裝的,看個人需求.對于AFN的架構(gòu)就不多說了.
AFHTTPRequestOperationManager 有個屬性@property (nonatomic, strong) NSOperationQueue *operationQueue;這個屬性不是readonly的,所以就從這個下手.還有它的complete隊列屬性:completionQueue,completionGroup.
1)代碼部分
創(chuàng)建自己要操作的隊列mygroup,以及queue,便于監(jiān)聽.以及請求所需要的NSOperationQueue.
2)創(chuàng)建請求方法
- (void)makeAFcomplete:(void (^)(void))complete
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager setOperationQueue:myQueue()];//設(shè)置操作隊列的同時的最大數(shù)
[manager setCompletionGroup:mygroup()]; //設(shè)置complete的group
[manager setCompletionQueue:queue_t()];? //設(shè)置complete的queue
dispatch_group_enter(mygroup());
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
[manager GET:@"*******" parameters:nil
success:^(AFHTTPRequestOperation * _Nonnull operation, id? _Nonnull responseObject) {
if (complete) {
complete();
}
dispatch_group_leave(mygroup());
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
if (complete) {
complete();
}
}];
}
3)調(diào)用測試一下
4)測試結(jié)果
基本上就完成了數(shù)據(jù)的同步執(zhí)行和監(jiān)聽
備注:以上方法只是達(dá)到了效果,但是會產(chǎn)生什么意外的bug,暫時沒有測試,如果有更簡單的方式,求指點(diǎn)!