美文网首页
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