我正在尝试执行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)
但是当信号代码到达时它已经传递了信号量等待代码,它永远不会等待减去信号量计数。
为什么?
答案 0 :(得分:10)
您已使用参数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
块,在完成所有请求后执行。