在什么线程dispatch_semaphore_wait正在等待?

时间:2014-08-04 14:35:16

标签: ios objective-c

我想更好地理解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);
});
  1. 我将等待哪个帖子?
  2. 或者如果我使用DISPATCH_QUEUE_PRIORITY_DEFAULT代替DISPATCH_QUEUE_PRIORITY_BACKGROUND

3 个答案:

答案 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()来确定在哪个线程中等待,因为:

  • 全局队列不是单个线程,而是一个线程池。
  • 只有串行队列可以是单线程的,但Apple文档中没有指定。

因此,为了确保您没有阻止任何内容,最好创建自己的串行队列来等待信号量。