GCD問題-三個異步任務執行完畢后再執行另外一個任務

劃重點:注意是三個異步任務,直接用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(@"執行任務");
    }
}

其他方法歡迎留言哦??!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容