for循环与异步闭包

时间:2018-04-23 13:43:42

标签: swift for-loop grand-central-dispatch

我试图通过segue传递一些数组但在此之前我必须运行简单的for循环但我有一个问题。对于每次迭代,我都需要执行具有网络和异步的功能。完成后,它必须将String附加到数组,并在for循环结束后,传递segue上的数据。

我有一个问题,因为在尝试这个时,我会因为没有传递数据而崩溃,并且在新控制器上是nil。我假设,我需要使用GCD或类似的东西,以便在完成并传递数据时通知。

我先尝试了什么:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

selectedStory = stories[indexPath.row]

for chapter in (selectedStory?.chapters)! {
  DataService.instance.retrieveUsername(forID: chapter.author) { (returnedUsernamed) in
    self.selectedStoryChapterAuthors?.append(returnedUsernamed)

  }
}

self.performSegue(withIdentifier: "goToStory", sender: self)}

我是如何尝试使用DispatchGroup的,但没有工作:

let dispatchGroup = DispatchGroup()

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

selectedStory = stories[indexPath.row]

for chapter in (selectedStory?.chapters)! {
  dispatchGroup.enter()  //  Enter the dispatch group
  DataService.instance.retrieveUsername(forID: chapter.author) { (returnedUsernamed) in
    self.selectedStoryChapterAuthors?.append(returnedUsernamed)

    self.dispatchGroup.leave()
  }
}

dispatchGroup.notify(queue: DispatchQueue.main, execute: {
  self.performSegue(withIdentifier: "goToStory", sender: self)
}) }

对此有何想法?如果需要更多信息/代码,请知道。

1 个答案:

答案 0 :(得分:0)

好的,我找到了一些有帮助的解决方案。 我基本上在第二个视图控制器中运行循环,使其工作的主要功能是添加

DispatchQueue.main.async {
  // cell configuration
}

在CellForRow方法中。

感谢您的投入!