由于工作需要,我们需要在多个网络请求成功后去执行相关逻辑,刚开始想到了调度组,但是网络请求返回结果又是在异步进行并且是耗时所以无法得到解决。所以就用到了信号。具体步棸如下。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
//11111111111111
dispatch_group_async(group, queue, ^{
[JJHTTPClient getOrPostUrl:isCDNRequest?@"get":@"post" haveCacheString:isCDNRequest?cdnStr:str withParam:params withSuccessBlock:^(id data) {
第一个网络请求成功后逻辑处理
以下两条代码一定要注意,缺一不可。
NSLog(@"任务一");
dispatch_semaphore_signal(sem);
}
withFailedBlock:^(NSDictionary *dict)
{
}
withErrorBlock:^(NSString *message)
{
}];
});
//222222
dispatch_group_async(group, queue, ^{
[JJHTTPClient getOrPostUrl:isCDNRequest?@"get":@"post" haveCacheString:isCDNRequest?cdnStr:str withParam:params withSuccessBlock:^(id data) {
第二个网络请求成功后逻辑处理
以下两条代码一定要注意,缺一不可。
NSLog(@"任务二");
dispatch_semaphore_signal(sem);
}
withFailedBlock:^(NSDictionary *dict)
{
}
withErrorBlock:^(NSString *message)
{
}];
});
//33333333
dispatch_group_async(group, queue, ^{
[JJHTTPClient getOrPostUrl:isCDNRequest?@"get":@"post" haveCacheString:isCDNRequest?cdnStr:str withParam:params withSuccessBlock:^(id data) {
第三个网络请求成功后逻辑处理
以下两条代码一定要注意,缺一不可。
NSLog(@"任务三");
dispatch_semaphore_signal(sem);
}
withFailedBlock:^(NSDictionary *dict)
{
}
withErrorBlock:^(NSString *message)
{
}];
});
----------------------------------------------
//在分组的所有任务完成后触发
dispatch_group_notify(group, queue, ^{
注意有几个任务就加几个信号,提示DISPATCH_TIME_FOREVER是可以自己定义时间的,就是多长时间没有请求成功就执行该代码。
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
NSLog(@"任务请求完成");
});
网友评论