信号量并没有快速等待

Dan*_*ico 3 semaphore swift

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

我用这种方式初始化信号量:

let sem = dispatch_semaphore_create(2);
Run Code Online (Sandbox Code Playgroud)

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

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")
}
Run Code Online (Sandbox Code Playgroud)

然后I信号的3倍(在每个请求onSuccessonFailure):

dispatch_semaphore_signal(sem)
Run Code Online (Sandbox Code Playgroud)

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

为什么?

Rob*_*Rob 10

你已经指定dispatch_semaphore_create了一个参数2(就像调用dispatch_semaphore_signal两次),然后再发出三次信号(总共五次),但你似乎只有一次等待(因为你开始了,所以不会等待你的信号量数量2).

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

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

  1. 创建一个dispatch_group_t:

    dispatch_group_t group = dispatch_group_create();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后dispatch_group_enter在每次请求之前做三次.

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

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