美文网首页
GCD问题-三个异步任务执行完毕后再执行另外一个任务

GCD问题-三个异步任务执行完毕后再执行另外一个任务

作者: 红姑娘 | 来源:发表于2019-03-27 17:14 被阅读0次

划重点:注意是三个异步任务,直接用dispatch_group是行不通的。
暂时想到了三种方法:

1、利用dispatch_group_enter、leave特性。

这两个方法类似信号量dispatch_group_enter +1 、dispatch_group_leave -1。当为0时调用dispatch_group_notify方法,并且dispatch_group_wait停止等待。

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(queue, ^{
    sleep(2);
    NSLog(@"任务1执行");
    dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
    sleep(3);
    NSLog(@"任务2执行");
    dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
    sleep(4);
    NSLog(@"任务3执行");
    dispatch_group_leave(group);
});
dispatch_group_notify(group, queue, ^{
    NSLog(@"notify执行");
});

2、用信号量

信号量大于0资源可用、否则会进行等待、原理跟方法1差不多

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_semaphore_t semphore = dispatch_semaphore_create(0);
dispatch_async(queue, ^{
    sleep(2);
    NSLog(@"任务1执行");
    dispatch_semaphore_signal(semphore);
});
dispatch_async(queue, ^{
    sleep(3);
    NSLog(@"任务2执行");
    dispatch_semaphore_signal(semphore);
});
dispatch_async(queue, ^{
    sleep(4);
    NSLog(@"任务3执行");
    dispatch_semaphore_signal(semphore);
});
dispatch_semaphore_wait(semphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semphore, DISPATCH_TIME_FOREVER);
NSLog(@"执行等待");

你问我为啥写了3个dispatch_semaphore_wait~~~,因为信号量初始化不能为负值啊。。。。这点欢迎大神指点。

3、KVO
创建一个属性KVO观察其值当值降为0时,执行该任务

self.num = @"";
[self addObserver:self forKeyPath:@"num" options:NSKeyValueObservingOptionNew context:nil];
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
    sleep(2);
    NSLog(@"任务1执行");
   self.num = [self.num stringByAppendingString:@"+"];
});
dispatch_async(queue, ^{
    sleep(3);
    NSLog(@"任务2执行");
    self.num = [self.num stringByAppendingString:@"+"];
});
dispatch_async(queue, ^{
    sleep(4);
    NSLog(@"任务3执行");
   self.num = [self.num stringByAppendingString:@"+"];
});
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
   if ([self.num isEqualToString:@"+++"]){
        NSLog(@"执行任务");
   }

}

相关文章

网友评论

      本文标题:GCD问题-三个异步任务执行完毕后再执行另外一个任务

      本文链接:https://www.haomeiwen.com/subject/zpozvqtx.html