这个 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)
我对 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)