信号量并没有快速等待

时间:2015-01-21 20:00:14

标签: swift semaphore

我正在尝试执行3个异步请求,并使用信号量控制加载,以了解所有加载后的信息。

我以这种方式启动信号量:

let sem = dispatch_semaphore_create(2);

然后将等待信号量代码发送到后台:

let backgroundQueue = dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)
dispatch_async(backgroundQueue) { [unowned self] () -> Void in
    println("Waiting for filters load")
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    println("Loaded")
}

然后我发出3次信号(每次请求onSuccessonFailure):

dispatch_semaphore_signal(sem)

但是当信号代码到达时它已经传递了信号量等待代码,它永远不会等待减去信号量计数。

为什么?

1 个答案:

答案 0 :(得分:10)

您已使用参数dispatch_semaphore_create指定2(这类似于调用dispatch_semaphore_signal两次),然后再发出三次信号(总共五次),但是你似乎只有一次等待(因为你开始计算2的信号量而不会等待)。

这显然无法奏效。即使您修复了这个问题(例如,使用零来创建信号量然后发出三次等待),这种方法也是不可取的,因为您不必要地占用等待其他请求完成的线程。

这是调度组的教科书候选人。所以你通常会使用以下内容:

  1. 创建dispatch_group_t

    dispatch_group_t group = dispatch_group_create();
    
  2. 然后在每次请求之前执行三次dispatch_group_enter

  3. 在三个onSuccess / onFailure块对中的每一个中,在两个块中都执行dispatch_group_leave

  4. 创建一个dispatch_group_notify块,在完成所有请求后执行。