概述
閑話少說直接開干! 在開發(fā)的過程中,相信你會(huì)遇到這2個(gè)場景,有四個(gè)網(wǎng)絡(luò)需要執(zhí)行,分別命名為網(wǎng)絡(luò)A, 網(wǎng)絡(luò)B, 網(wǎng)絡(luò)C, 網(wǎng)絡(luò)D:
1.情況一: 順序執(zhí)行不能亂 網(wǎng)絡(luò)A -->網(wǎng)絡(luò)B -->網(wǎng)絡(luò)C -->網(wǎng)絡(luò)D
a執(zhí)行完, 執(zhí)行b
b執(zhí)行完, 執(zhí)行c
c執(zhí)行完, 執(zhí)行d
2.情況二: 網(wǎng)絡(luò)a, 網(wǎng)絡(luò)b, 網(wǎng)絡(luò)c, 網(wǎng)絡(luò)d的完成順序不用管, 但是必須這4個(gè)網(wǎng)絡(luò)都執(zhí)行完才能執(zhí)行某一個(gè)邏輯(命名為邏輯A)
實(shí)現(xiàn)方法
1.情況一: 順序執(zhí)行
先看一下正常的調(diào)用順序的返回結(jié)果,執(zhí)行了多次發(fā)現(xiàn)網(wǎng)絡(luò)的返回順序是隨機(jī)的提供截圖2張001.png
002.png
- (void)testStart {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
// 網(wǎng)絡(luò)1
[self networkRequestOneWith:semaphore];
/* 執(zhí)行到這個(gè)位置的時(shí)候信號(hào)量是0,所以在此線程中等待 直到信號(hào)量大于0的時(shí)候 才會(huì)執(zhí)行該語句的下一步 */
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
// 網(wǎng)絡(luò)2
[self networkRequestTwoWith:semaphore];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
// 網(wǎng)絡(luò)3
[self networkRequestThreeWith:semaphore];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
// 網(wǎng)絡(luò)4
[self networkRequestFourWith:semaphore];
});
}
- (void)networkRequestOneWith:(dispatch_semaphore_t)semaphore {
[NetworkManager launchNetworkWithSuccess:^(id responseObject) {
DLog(@"網(wǎng)絡(luò)1111成功");
/* 網(wǎng)絡(luò)返回成功需要進(jìn)行下一個(gè)網(wǎng)絡(luò) 此處語句作用是信號(hào)量+1 */
dispatch_semaphore_signal(semaphore);
} failure:^(NSError *httpError, NSString *appErrorCode, id responseObject) {
}];
}
只列舉出其中一個(gè)網(wǎng)絡(luò),其他3個(gè)網(wǎng)絡(luò)的寫法類似,下面看一下運(yùn)行結(jié)果:
003.png
004.png
2.情況二:多個(gè)網(wǎng)絡(luò)都執(zhí)行完 再去執(zhí)行特定的某一個(gè)網(wǎng)絡(luò)
先看一下平時(shí)的group的基本使用方法
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//模擬網(wǎng)絡(luò)1
DLog(@"網(wǎng)絡(luò)1111成功");
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//模擬網(wǎng)絡(luò)2
DLog(@"網(wǎng)絡(luò)2222成功");
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
///模擬網(wǎng)絡(luò)3
DLog(@"網(wǎng)絡(luò)3333成功");
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
///模擬網(wǎng)絡(luò)4
DLog(@"網(wǎng)絡(luò)4444成功");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
DLog(@"網(wǎng)絡(luò)1 網(wǎng)絡(luò)2 網(wǎng)絡(luò)3 網(wǎng)絡(luò)4 全部執(zhí)行完畢");
});
運(yùn)行看一下效果:
005.png
006.png
確實(shí)是我們想象的效果網(wǎng)絡(luò)1 2 3 4執(zhí)行完的順序是隨機(jī)的并且最后執(zhí)行的也是我們設(shè)置好的邏輯!
上面代碼中模擬的位置如果換成真的的網(wǎng)絡(luò)代碼其實(shí)就會(huì)出現(xiàn)錯(cuò)誤,因?yàn)榫W(wǎng)絡(luò)本身是一個(gè)異步過程,所以會(huì)導(dǎo)致提前執(zhí)行我們指定的邏輯 口說無憑 上代碼看效果
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//模擬網(wǎng)絡(luò)1
[NetworkManager launchNetworkWithSuccess:^(id responseObject) {
DLog(@"網(wǎng)絡(luò)1111成功");
} failure:^(NSError *httpError, NSString *appErrorCode, id responseObject) {
}];
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//模擬網(wǎng)絡(luò)2
[NetworkManager launchNetworkWithSuccess:^(id responseObject) {
DLog(@"網(wǎng)絡(luò)22222成功");
} failure:^(NSError *httpError, NSString *appErrorCode, id responseObject) {
}];
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
///模擬網(wǎng)絡(luò)3
[NetworkManager launchNetworkWithSuccess:^(id responseObject) {
DLog(@"網(wǎng)絡(luò)3333成功");
} failure:^(NSError *httpError, NSString *appErrorCode, id responseObject) {
}];
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
///模擬網(wǎng)絡(luò)4
[NetworkManager launchNetworkWithSuccess:^(id responseObject) {
DLog(@"網(wǎng)絡(luò)44444成功");
} failure:^(NSError *httpError, NSString *appErrorCode, id responseObject) {
}];
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
DLog(@"網(wǎng)絡(luò)1 網(wǎng)絡(luò)2 網(wǎng)絡(luò)3 網(wǎng)絡(luò)4 全部執(zhí)行完畢");
});
運(yùn)行看效果:
007.png
008.png
打印結(jié)果一目了然,首先執(zhí)行了我們原本以為最后執(zhí)行的代碼,所以這么寫是不對(duì)的
直接上正確代碼
- (void)testStart {
dispatch_queue_t quete = dispatch_queue_create("XIAXIAQUEUE", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
// 網(wǎng)絡(luò)1
dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{
[self networkRequestOneWith:group];
});
// 網(wǎng)絡(luò)2
dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{
[self networkRequestTwoWith:group];
});
// 網(wǎng)絡(luò)3
dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{
[self networkRequestThreeWith:group];
});
// 網(wǎng)絡(luò)4
dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{
[self networkRequestFourWith:group];
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
DLog(@"網(wǎng)絡(luò)1 網(wǎng)絡(luò)2 網(wǎng)絡(luò)3 網(wǎng)絡(luò)4 全部執(zhí)行完畢");
});
}
- (void)networkRequestOneWith:(dispatch_group_t)group {
[NetworkManager launchNetworkWithSuccess:^(id responseObject) {
DLog(@"網(wǎng)絡(luò)1111成功");
dispatch_group_leave(group);
} failure:^(NSError *httpError, NSString *appErrorCode, id responseObject) {
dispatch_group_leave(group);
}];
}
運(yùn)行看效果:
09.png
10.png
結(jié)果一目了然不管怎么執(zhí)行都是最后執(zhí)行我們要的代碼