劃重點:注意是三個異步任務,直接用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(@"執行任務");
}
}
其他方法歡迎留言哦??!