1. 界面存在多個請求笋熬,所有請求結(jié)束后才進行某操作。一般采用
dispatch_group_t實現(xiàn)不了網(wǎng)絡(luò)請求處理,菩鲜,因為網(wǎng)絡(luò)請求是異步處理园细。
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//請求1
NSLog(@"Request_1");
});
、接校、猛频、
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//界面刷新
NSLog(@"任務(wù)均完成,刷新界面");
});
2. 界面存在多個請求蛛勉,所有請求依次結(jié)束后才進行某操作鹿寻。一般采用
//1.任務(wù)一:下載圖片
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
// request網(wǎng)絡(luò)請求
[self request_A];
}];
、诽凌、毡熏、
// 設(shè)置依賴
[operation2 addDependency:operation1]; //任務(wù)二依賴任務(wù)一
[operation3 addDependency:operation2]; //任務(wù)三依賴任務(wù)二
// 創(chuàng)建隊列并加入任務(wù)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperations:@[operation3, operation2, operation1] waitUntilFinished:NO];
3.上述兩種方法都會出現(xiàn)問題,要解決該類問題侣诵,則需要用到信號量痢法,而要在網(wǎng)絡(luò)請求中間使用dispatch_semaphore來處理
// 創(chuàng)建信號量并設(shè)置計數(shù)默認為0
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
// 計數(shù)+1操作(此處放到網(wǎng)絡(luò)請求成功 或者失敗的地方調(diào)用)
dispatch_semaphore_signal(sema);
// 判斷計數(shù),若計數(shù)為0杜顺,則程序一直等待财搁;若計數(shù)大于1,則繼續(xù)執(zhí)行哑舒。
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
這樣就可以解決了