【问题标题】:Swift - Synchronous execution of large for loop without completion handlersSwift - 无需完成处理程序即可同步执行大型 for 循环
【发布时间】:2018-10-31 05:56:25
【问题描述】:

这更像是一个理论问题。如果我有一个大的 for 循环,说

   var array = []
   let myGroup = DispatchGroup()
   for i in 0..<1000000000 {
       myGroup.enter()
       let x = i + 1
       let y = (x/2 * 15832) ^ 15
       array.append(x)
       array.append(y)
       myGroup.leave()
    }
    myGroup.notify(queue: .main) {
       performOperationForArray(array:array)
    }

这会确保 for 循环中的所有内容在 performOperationForArray 之前执行吗?即使循环内的计算本身没有完成处理程序?

谢谢。

【问题讨论】:

  • 在再次进入之前,您正在进入和离开群组。这将调用通知您的循环运行的次数。
  • 如果是这种情况,有没有办法强制整个for循环在performOperationsForArray函数执行之前运行?
  • 这就是普通 for 循环的工作方式。运行正常循环时遇到什么问题?
  • 在运行以下操作之前循环没有完成......这就是问题
  • 那么您可能正在做的不是您在循环中发布的代码。

标签: swift asynchronous synchronization


【解决方案1】:

不需要调度组。只需在后台运行循环。循环完成后,根据需要在主队列上调用performOperationForArray

DispatchQueue.global().async {
   var array = []
   for i in 0..<1000000000 {
       let x = i + 1
       let y = (x/2 * 15832) ^ 15
       array.append(x)
       array.append(y)
    }

    DispatchQueue.main.async {
        performOperationForArray(array:array)
    }
}

当然,这假设您的真实代码没有在循环内进行任何异步处理。

【讨论】:

  • 啊,你是说DispatchQueue.global().async
  • 糟糕。是的。我修正了那个错字。
  • 这是否会强制大型 for 循环的内容在运行主异步线程之前完全执行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
相关资源
最近更新 更多