一、 关键词解释
1)创建一个信号量:
使用: dispatch_semaphore_t dispatch_semaphore_create(long value);
参数: long value
1. 如果要使两个线程同步,传0
2. 如果要管理有限的临界资源,传资源个数
备注: 个人理解为该数字+1得到当前可同时执行的最大任务数量
2)等待(信号量 -1)
使用: 一个信号量: dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
1. 如果资源个数<0,那么这个方法会一直阻塞,直到信号(signal)的到来(返回值是0),
3)发送一个信号(信号量+1):
使用: dispatch_semaphore_signal(semaphore);
1. 信号量+1,如果之前信号量<0,那么唤醒一个等待这个信号量的线程。
二、 使用
- (void)viewDidLoad {
[super viewDidLoad];
NSInteger result = [self doSomething];
NSLog(@"result: %ld", (long)result); // 输出: result: 2
}
- (NSInteger)doSomething {
__block NSInteger stepValue = 0;
dispatch_queue_t myqueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
// 任务1
dispatch_async(myqueue, ^{
NSLog(@"任务1 - 当前线程: %@", [NSThread currentThread]);
stepValue += 1;
dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
// 任务2
dispatch_async(myqueue, ^{
NSLog(@"任务2 - 当前线程: %@", [NSThread currentThread]);
stepValue += 1;
dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return stepValue;
}
/* 输出:
任务1 - 当前线程: <NSThread: 0x600002281bc0>{number = 4, name = (null)}
任务2 - 当前线程: <NSThread: 0x600002281bc0>{number = 4, name = (null)}
*/
三、使用例子(比如: 获取相册权限)
- (BOOL)hasPermissionForOpenAlbum {
__block BOOL hasPermission = NO;
// 创建信号, 初始值为0
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
hasPermission = (status == PHAuthorizationStatusAuthorized);
// 信号响应, 此时信号加1. 线程停止阻塞, 继续执行;
dispatch_semaphore_signal(semaphore);
}];
// 信号量减1, 此时线程进行阻塞;
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return hasPermission;
}