我正在尝试执行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)
但是,当信号码到达时,它已经传递了信号量等待码,它从不等待减去信号量计数。
为什么?
发布于 2015-01-21 20:22:29
您已经用参数2
(这就像两次调用dispatch_semaphore_signal
)指定了2
,然后再向它发出三次信号(总共五次),但是您似乎只有一个等待(这根本不会等待,因为您用一个2
数启动了信号量)。
这显然行不通。即使您修复了这个问题(例如,使用零来创建信号量,然后发出三个等待),这种方法也是不可取的,因为您不必要地将一个线程捆绑在一起,等待其他请求完成。
这是调度组的教科书候选人。因此,您通常会使用以下方法:
dispatch_group_t
:
dispatch_group_t群= dispatch_group_create();dispatch_group_enter
。onSuccess
/onFailure
块对中的每个块中,在两个块中执行一个dispatch_group_leave
。dispatch_group_notify
块,在完成所有请求时执行该块。https://stackoverflow.com/questions/28075813
复制相似问题