我想更好地理解dispatch_semaphore_wait
的用法。我明白这个用法,但我没有得到我实际上在等待哪个线程。如果我将在主线程上执行此操作,我将阻止主线程,或者如果我将这样做:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
});
DISPATCH_QUEUE_PRIORITY_DEFAULT
代替DISPATCH_QUEUE_PRIORITY_BACKGROUND
? 答案 0 :(得分:0)
在1和2中,您将等待DISPATCH_QUEUE_PRIORITY_HIGH和DISPATCH_QUEUE_PRIORITY_BACKGROUND所在的主题。在这种情况下,它的相同“队列”/线程和差异依赖于调度程序处理所提交任务的选择的方式(高,中或低优先级。其中低等于DISPATCH_QUEUE_PRIORITY_BACKGROUND,高等级为DISPATCH_QUEUE_PRIORITY_HIGH)。不依赖于UI线程的东西。 dispatch_get_global_queue
调用确实指向iOS为您创建的线程。网上有很多指南描述了这一点,以及如何在多线程环境中处理任务的调度。
Google是你的朋友;)
答案 1 :(得分:0)
如果您试图同步查找用户是否已提供地址簿访问权限,我建议如下:
__block BOOL accessGranted = NO;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
accessGranted = granted;
if(semaphore) {
dispatch_semaphore_signal(semaphore);
}
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_release(semaphore);
semaphore = NULL;
return accessGranted;
答案 2 :(得分:0)
您无法通过在全局队列中调用dispatch_semaphore_wait()
来确定在哪个线程中等待,因为:
因此,为了确保您没有阻止任何内容,最好创建自己的串行队列来等待信号量。