【问题标题】:Would I need to have an asynchronous function for this while loop? [duplicate]我需要为这个while循环提供一个异步函数吗? [复制]
【发布时间】:2020-01-03 13:41:10
【问题描述】:

我对 swift 和整体编程相当陌生,我有一些代码将循环通过一个硬编码的数量来表示帖子(这将始终保持不变,所以我对其进行了硬编码)并运行一个带有位置的函数当前 while 循环到达的位置返回从 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 中,我的数组返回空。我是否需要某种异步函数来只允许 performSegue(withIdentifier: "showHome", sender: nil) 代码在 while 循环完成并因此拥有完整的 url 数组时执行?

谢谢,

内森

【问题讨论】:

  • 不相关,但while 循环非常麻烦。将其替换为 for pos in 0..&lt;numOfPosts {… 并删除要声明和递增 pos 的行。

标签: ios swift xcode swift5


【解决方案1】:

你需要一个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)
   } 
}

【讨论】:

  • 谢谢,我试试看,如果你有时间,你能解释一下什么是dispachGroup吗?谢谢!编辑:它就像一个魅力!
  • 阻止不是答案。这是糟糕的用户体验。
  • @Alexander-ReinstateMonica 我同意,但 UX 不是我的事。一个活动加载器就足够了
  • UX' 是每个人的事。一个阻塞调用就可以完全破坏外观或产品,以及用户对质量的感知。一个活动加载器会很好,但这仍然需要在线程外完成这项工作,否则所有 UI 都会冻结。
【解决方案2】:

我猜问题是您的方法 FeaturedPostsManager.shared.getFeaturedPosts 是异步的。

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

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

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多