GCD高级使用
任务组(dispatch_group_t)
- (void)taskGroup {
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, globalQueue, ^{
NSLog(@"任务1开始");
[NSThread sleepForTimeInterval:4];
NSLog(@"任务1结束");
});
dispatch_group_async(group, globalQueue, ^{
NSLog(@"任务2开始");
[NSThread sleepForTimeInterval:3];
NSLog(@"任务2结束");
});
dispatch_group_notify(group, globalQueue, ^{
NSLog(@"所有任务均执行完毕");
});
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*2);
long result = dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
if (result == 0) {
NSLog(@"任务全部完成");
}else {
NSLog(@"任务还没结束");
}
}
多元调用(dispatch_apply)
- (void)applyTask {
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i = 0; i < 100; i++) {
[array addObject:@(i)];
}
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
dispatch_apply(array.count, globalQueue, ^(size_t index){
NSLog(@"%@", array[index]);
});
});
}
阻碍任务(dispatch_barrier_async)
- (void)barrierTask {
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"任务1");
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"任务2");
}
});
dispatch_barrier_async(queue, ^{
NSLog(@"障碍任务");
[NSThread sleepForTimeInterval:3];
NSLog(@"障碍任务结束");
});
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"任务3");
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"任务4");
}
});
信号量(dispatch_semaphore_t semaphore )
- (void)semaphoreTask {
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
__block NSMutableArray *array = [[NSMutableArray alloc] init];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
for (int i = 0; i < 100000; i++) {
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[array addObject:@(i)];
dispatch_semaphore_signal(semaphore);
});
}
NSLog(@"%@", array);
}