信号灯不在等待 swift
Semaphore is not waiting swift
我正在尝试执行 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 次信号(在每个请求 onSuccess
和 onFailure
上):
dispatch_semaphore_signal(sem)
但是当信号代码到达时它已经通过了信号量等待代码,它从不等待减去信号量计数。
为什么?
您已指定 dispatch_semaphore_create
的参数为 2
(类似于调用 dispatch_semaphore_signal
两次),然后再向其发出信号三次(总共五次) ,但您似乎只有一次等待(根本不会等待,因为您以 2
的计数启动了信号量)。
这显然行不通。即使您修复了该问题(例如,使用零来创建信号量,然后发出三个等待)整个方法也是不可取的,因为您不必要地占用线程等待其他请求完成。
这是调度组的教科书候选。所以你通常会使用以下内容:
创建 dispatch_group_t
:
dispatch_group_t group = dispatch_group_create();
然后做三个dispatch_group_enter
,每个请求前一次。
在三个 onSuccess
/onFailure
块对中的每个块中,在两个块中做一个 dispatch_group_leave
。
创建一个 dispatch_group_notify
块,将在所有请求完成后执行。
我正在尝试执行 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 次信号(在每个请求 onSuccess
和 onFailure
上):
dispatch_semaphore_signal(sem)
但是当信号代码到达时它已经通过了信号量等待代码,它从不等待减去信号量计数。
为什么?
您已指定 dispatch_semaphore_create
的参数为 2
(类似于调用 dispatch_semaphore_signal
两次),然后再向其发出信号三次(总共五次) ,但您似乎只有一次等待(根本不会等待,因为您以 2
的计数启动了信号量)。
这显然行不通。即使您修复了该问题(例如,使用零来创建信号量,然后发出三个等待)整个方法也是不可取的,因为您不必要地占用线程等待其他请求完成。
这是调度组的教科书候选。所以你通常会使用以下内容:
创建
dispatch_group_t
:dispatch_group_t group = dispatch_group_create();
然后做三个
dispatch_group_enter
,每个请求前一次。在三个
onSuccess
/onFailure
块对中的每个块中,在两个块中做一个dispatch_group_leave
。创建一个
dispatch_group_notify
块,将在所有请求完成后执行。