【问题标题】:Semaphore is not waiting swift信号量没有迅速等待
【发布时间】:2015-01-21 20:00:14
【问题描述】:

我正在尝试执行 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)

但是当信号码到达时它已经通过了信号量等待码,它从不等待减去信号量计数。

为什么?

【问题讨论】:

    标签: swift semaphore


    【解决方案1】:

    您已指定 dispatch_semaphore_create 参数为 2(这就像调用 dispatch_semaphore_signal 两次),然后再发出信号 3 次(总共 5 次),但您似乎只有一个等待(根本不会等待,因为您以 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 块,将在所有请求完成后执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 2014-10-21
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多