这个 while 循环需要一个异步函数吗?

Would I need to have an asynchronous function for this while loop?

我对 swift 和整个编程还很陌生,我有一些代码会遍历代表帖子的硬编码数量(这将始终保持不变,所以我对其进行了硬编码)并且运行 一个函数,其中 while 循环当前到达的位置 returns 从 firebase 下载的缓存视频文件的 URL 字符串。每当返回 10 个帖子的 URL 时,它就会附加到一个数组中,到最后应该有 10 个字符串,这些字符串对于设备上存储的不同视频都是唯一的 url:

 var fileArray = [String]()

 func getPosts(){
    var pos = 0
    let numOfPosts = 10
    while pos <= numOfPosts{
        FeaturedPostsManager.shared.getFeaturedPosts(index: pos, completion: { url in
            if url != nil{
                self.fileArray.append(url!)
            }else{
                print("error")
            }
        })
        pos += 1
    }
    performSegue(withIdentifier: "showHome", sender: nil)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let recveiverVC = segue.destination as! HomeViewController
    recveiverVC.fileArray = fileArray
}

我的问题是 performSegue(withIdentifier: "showHome", sender: nil) 似乎在数组中甚至有一个 url 值之前就已执行,正如我在控制台中看到的 URL 是被成功检索,就在我的 HomeViewController 中,我的数组 returns 为空时。我是否需要某种异步函数来仅允许 performSegue(withIdentifier: "showHome", sender: nil) 代码在 while 循环完成时执行,从而获得完整的 url 数组?

谢谢,

内森

您需要一个 DispatchGroup,当您需要在 运行 一堆异步调用

之后得到通知时使用
 func getPosts(){
    var pos = 0
    let numOfPosts = 10
    let g = DispatchGroup()  //// 1
    while pos <= numOfPosts{
        g.enter()    //// 2
        FeaturedPostsManager.shared.getFeaturedPosts(index: pos, completion: { url in
            if url != nil{
                self.fileArray.append(url!)
            }else{
                print("error")
            }
            g.leave()     //// 3
        })
        pos += 1
    }

   g.notify(queue:.main) {      //// 4
     self.performSegue(withIdentifier: "showHome", sender: nil)
   } 
}

我想问题是你的方法 FeaturedPostsManager.shared.getFeaturedPosts 是异步的。

您有更多选择,其中之一是您将按顺序调用 getFeaturedPosts,当调用次数达到 10 次时,您将调用

self.performSegue(withIdentifier: "showHome", sender: nil)