// 创建信号量
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
// 创建全局并行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
// 请求一
[loginCode getUserInfoWithNick:nil andUserId:kUserId onSuc:^(id data) {
NSLog(@"yue");
dispatch_semaphore_signal(semaphore);
} andFail:^(NSError *error) {
}];
});
dispatch_group_async(group, queue, ^{
// 请求二
[CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {
NSLog(@"duihuan11");
dispatch_semaphore_signal(semaphore);
} onFailure:^(NSError *error) {
}];
});
dispatch_group_async(group, queue, ^{
// 请求三
[CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {
NSLog(@"duihuan22");
dispatch_semaphore_signal(semaphore);
} onFailure:^(NSError *error) {
}];
});
dispatch_group_notify(group, queue, ^{
// 三个请求对应三次信号等待
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//在这里 进行请求后的方法,回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI操作
});
});
第二种 通过请求数量计数
定义一个block
typedef void(^Complete)();
将block作为类的属性
@property (copy, nonatomic) Complete complete;
实现方式:
NSInteger requestCount = 0;
//第一个网络请求
[CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {
NSLog(@"duihuan11");
requestCount++;
if (self.complete) {
self.complete();
}
} onFailure:^(NSError *error) {
}];
//第二个网络请求
[CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {
NSLog(@"duihuan22");
requestCount++;
if (self.complete) {
self.complete();
}
} onFailure:^(NSError *error) {
}];
//第三个网络请求
[CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {
NSLog(@"duihuan33");
requestCount++;
if (self.complete) {
self.complete();
}
} onFailure:^(NSError *error) {
}];
self.complete = ^{
//请求网络的数量等于3表示三个网络请求已完成
if (requestCount == 3) {
//在这里 进行请求后的方法,回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI操作
});
}
};
dispatch_group + 信号量
- (void)groupSync
{
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(5);
NSLog(@"任务一完成");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(8);
NSLog(@"任务二完成");
dispatch_group_leave(group);
});
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"任务完成");
});
}
- (void)groupSync2
{
dispatch_queue_t dispatchQueue = dispatch_queue_create("com.shidaiyinuo.NetWorkStudy1", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
dispatch_group_t dispatchGroup = dispatch_group_create();
dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
dispatch_async(globalQueue, ^{
sleep(3);
NSLog(@"任务一完成");
});
});
dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
dispatch_async(globalQueue, ^{
sleep(2);
NSLog(@"任务二完成");
});
});
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
NSLog(@"dispatch_group_notify 被执行了");
});
}
#pragma mark - 等任务1执行完再执行任务2
- (void)groupSync3
{
__block dispatch_semaphore_t semap = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(5);
NSLog(@"我是任务一");
dispatch_semaphore_signal(semap);
semap = nil;
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
if (dispatch_semaphore_wait(semap, dispatch_time(DISPATCH_TIME_NOW, 30 * NSEC_PER_SEC)))//超时返回非零
{
//处理超时 也可以把超时时间设置成forever;会一直等待直到收到信号
}
else//不超时返回0
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"我是任务二");
});
}
});
}
真实网络请求都是异步的,大概示例
dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_group_async(group,globalQuene, ^{
[self requestLaunchAdvData:^(BOOL success) {
STLLog(@"======== req result 1");
dispatch_group_leave(group);
}];
});
dispatch_group_enter(group);
dispatch_group_async(group,globalQuene, ^{
[self getAppCopywriting:^(BOOL success) {
STLLog(@"======== req result 2");
dispatch_group_leave(group);
}];
});
dispatch_group_enter(group);
dispatch_group_async(group,globalQuene, ^{
[InitIconApi getAppIconInfoWithCommplete:^(BOOL flag) {
STLLog(@"======== req result 3");
dispatch_group_leave(group);
}];
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
STLLog(@"======== req start 4");
[self checkUpdateUserInfo:^(BOOL success) {
}];
});
执行结果
2021-12-20 11:06:39.006219+0800 Demo[36748:3340841] ======== req result 2
2021-12-20 11:06:39.074218+0800 Demo[36748:3340841] ======== req result 3
2021-12-20 11:06:39.123974+0800 Demo[36748:3340841] ======== req result 1
2021-12-20 11:06:39.126951+0800 Demo[36748:3340841] ======== req start 4