【问题标题】:Dispatch Group not working for completion block调度组不适用于完成块
【发布时间】:2018-01-18 14:09:42
【问题描述】:

试图从网络调用中获取返回回复对象。会话是一个使用星形尖叫 API 的类。我似乎无法让它发挥作用。它只打印出一组来自第一个 id 的结果。我在这里错过了什么?

let myGroup = DispatchGroup()

for i in 0 ..< marketIds.count {
    myGroup.enter()
    self.session.retrieve(withMethod: MarketKeys.key, withParameters: [MarketKeys.id: marketIds[i]], completion: { (results, error) in
        print("results \n")
        print(results!)
        myGroup.leave()
        })
    }
myGroup.notify(queue:.main) {
print("Done")
}

【问题讨论】:

  • 我认为您应该为此查看NSOperation
  • @ReinierMelian 实际上,没有必要,他缺少通知部分...无论如何,我会添加一个相关问题。
  • 您缺少“通知”部分。相关:stackoverflow.com/a/41809248/5501940
  • session.retreive 是做什么的?
  • 我首先要确保 marketIds.count 实际上大于 1。在调用 enter 之后添加一个打印语句,并确保你循环的次数与你想象的一样多。 (旁注,这应该是 for id in marketIds 而不是使用下标。下标有效,但它为您的应用程序崩溃创造了更多机会。但这与您的问题无关。)

标签: ios swift concurrency grand-central-dispatch


【解决方案1】:

article 为您提供了简单的DispatchGroup 使用的快速参考指南。

一个例子:

let dispatchGroup = DispatchGroup()

dispatchGroup.enter()
longRunningFunction { dispatchGroup.leave() }

dispatchGroup.enter()
longRunningFunctionTwo { dispatchGroup.leave() }

dispatchGroup.notify(queue: .main) {
    print("Both functions complete ?")
}

当队列中的所有项目都已处理完毕时,将调用 notify 函数,并允许您对此做出相应反应。所以上面的例子会运行两个长时间运行的任务,然后会输出“Both functions complete ?”

【讨论】:

    【解决方案2】:

    添加此项以便可以向群组发送通知

     myGroup.notify(queue: .main) {
       print("Both functions complete ?")
      }
    

    【讨论】:

    • 在哪里添加这个?
    • 在 for 循环之外
    • 所以通知不是问题。问题是“会话检索”只执行一次。事实上,它可能会被调用 3 次或“marketIds”的计数
    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2012-05-30
    • 1970-01-01
    • 2022-01-02
    • 2017-05-19
    相关资源
    最近更新 更多