问:有5个耗时任务,每次最多执行两次,如何实现?
1. 创建信号量
/*
创建信号量为2
*/
dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
2. 创建队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
3.开始异步执行
信号量用法解释:
- 信号量的数量初始化,最好就是使用要执行任务的多少来定,如题是两次,则设置为2
- 每次执行一个任务,调用方法dispatch_semaphore_wait,让信号量减1
- 每次结束一个任务,调用方法dispatch_semaphore_signal,让信号量+1
- 信号量做了这些加减操作,如果信号量小于1,则任务不会执行,如果大于设置的信号量,则会多执行任务。所以,dispatch_semaphore_wait和dispatch_semaphore_signal应该是成对出现,才能保证信号量的设定
注意:
1.可以看出,如果设置信号量为1,就等同于同步执行的效果
2.也有一些用法是设置信号量为0的,进入任务的时候signal,离开任务的时候wait。
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"1任务开始执行");
[NSThread sleepForTimeInterval:3];
NSLog(@"1任务结束执行");
dispatch_semaphore_signal(semaphore);
});
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"2任务开始执行");
[NSThread sleepForTimeInterval:3];
NSLog(@"2任务结束执行");
dispatch_semaphore_signal(semaphore);
});
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"3任务开始执行");
[NSThread sleepForTimeInterval:3];
NSLog(@"3任务结束执行");
dispatch_semaphore_signal(semaphore);
});
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"4任务开始执行");
[NSThread sleepForTimeInterval:3];
NSLog(@"4任务结束执行");
dispatch_semaphore_signal(semaphore);
});
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"5任务开始执行");
[NSThread sleepForTimeInterval:3];
NSLog(@"5任务结束执行");
dispatch_semaphore_signal(semaphore);
});
zzZZZ```
网友评论