信号量是用来协调进程对共享资源的访问的;
GCD使用信号量有三种方式:
1、dispatch_group
dispatch_group_enter(group)和dispatch_group_leave(group),enter和leave必须配合使用,有几次enter就要有几次leave,否则group会一直存在.当所有enter的block都leave后,会执行dispatch_group_notify的block。
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"请求1"); dispatch_group_leave(group); });
dispatch_group_enter(group);
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"请求2");
dispatch_group_leave(group); });
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//界面刷新
NSLog(@"请求完成,刷新界面");
});
2、dispatch_barrier
(栅栏函数)dispatch_barrier_async函数的作用是等待所有位于barrier函数之前的操作执行完毕后执行,并且在barrier函数执行之后,barrier函数之后的操作才会得到执行.
dispatch_queue_t queue = dispatch_queue_create("10", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{ NSLog(@"---1---"); });
dispatch_async(queue, ^{ NSLog(@"---2---"); });
dispatch_barrier_async(queue, ^{ NSLog(@"---barrier---"); });
dispatch_async(queue, ^{ NSLog(@"---3---"); });
dispatch_async(queue, ^{ NSLog(@"---4---"); });
3、dispatch_semaphore
//创建信号量,参数:信号量的初值,如果小于0则会返回NULL
dispatch_semaphore_create(信号量值)
//等待降低信号量
dispatch_semaphore_wait(信号量,等待时间)
//提高信号量
dispatch_semaphore_signal(信号量)
正常的使用顺序是先降低然后再提高
// 创建队列组 dispatch_group_t group = dispatch_group_create();
// 创建信号量,并且设置值为2,crate的value表示,最多几个资源可访问 dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//任务1 dispatch_async(quene, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); NSLog(@"run task 1"); sleep(1); NSLog(@"complete task 1"); dispatch_semaphore_signal(semaphore); });
//任务2 dispatch_async(quene, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); NSLog(@"run task 2"); sleep(1); NSLog(@"complete task 2"); dispatch_semaphore_signal(semaphore); });
//任务3 dispatch_async(quene, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); NSLog(@"run task 3"); sleep(1); NSLog(@"complete task 3"); dispatch_semaphore_signal(semaphore); });
//任务4 dispatch_async(quene, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); NSLog(@"run task 4"); sleep(1); NSLog(@"complete task 4"); dispatch_semaphore_signal(semaphore); });
网友评论