首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >信号不是在等待迅速

信号不是在等待迅速
EN

Stack Overflow用户
提问于 2015-01-21 20:00:14
回答 1查看 5.9K关注 0票数 3

我正在尝试执行3次异步请求,并使用信号量控制加载,以了解何时都已加载。

我用这样的方式输入信号量:

代码语言:javascript
运行
复制
let sem = dispatch_semaphore_create(2);

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

代码语言:javascript
运行
复制
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):

代码语言:javascript
运行
复制
dispatch_semaphore_signal(sem)

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

为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-21 20:22:29

您已经用参数2 (这就像两次调用dispatch_semaphore_signal )指定了2,然后再向它发出三次信号(总共五次),但是您似乎只有一个等待(这根本不会等待,因为您用一个2数启动了信号量)。

这显然行不通。即使您修复了这个问题(例如,使用零来创建信号量,然后发出三个等待),这种方法也是不可取的,因为您不必要地将一个线程捆绑在一起,等待其他请求完成。

这是调度组的教科书候选人。因此,您通常会使用以下方法:

  1. 创建一个dispatch_group_t: dispatch_group_t群= dispatch_group_create();
  2. 然后在每个请求之前执行三次dispatch_group_enter
  3. 在三个onSuccess/onFailure块对中的每个块中,在两个块中执行一个dispatch_group_leave
  4. 创建一个dispatch_group_notify块,在完成所有请求时执行该块。
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28075813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档