这是我用来从Firebase存储中检索图像文件的代码:
let group = DispatchGroup()
print("starting ImageSetting")
group.enter()
for query in friendArray {
if imageList[query.uid] == nil {
print("going through iteration")
self.profpicRef.child("profile_pic/" + query.uid + ".jpeg").getData(maxSize: 1
* 1024 * 1024) { (data, error) in
print("accessing image")
if let error = error {
self.imageList[query.uid] = self.defaultImage
} else {
self.imageList[query.uid] = UIImage(data: data!)
}
}
}
}
group.leave()
我在
ViewWillAppear
中称为此方法。我也尝试了ViewDIdAppear
,但结果没有改变。这是我第一次运行此方法时得到的结果
starting ImageSetting
going through iteration
going through iteration
going through iteration
going through iteration
going through iteration
going through iteration
going through iteration
going through iteration
going through iteration
going through iteration
going through iteration
going through iteration
因此,第一次运行
getData()
不会进行。但是,在第二次运行时,该功能正常工作,我得到了所有图像
有什么办法可以解决此问题?
最佳答案
我怀疑问题是您没有真正正确地使用调度组。这里的问题是for
循环本质上是立即执行并立即完成的-是的,这些回调将在以后被调用,但这不是代码告诉调度组离开的地方。
(此外,我在示例代码中没有看到notify
调用,但是我假设这是稍后要调用的代码的一部分。)
因此,如果您要在代码中执行某些操作,而这取决于已加载这些图像,则会给您一个错误。而且我怀疑它可能第二次起作用了,因为您正在获取缓存的数据,该数据的执行速度可能足以满足您的目的。
解决此问题的一种方法是,确保在正确的位置添加调度组元素。也许是这样的...
let group = DispatchGroup()
print("starting ImageSetting")
for query in friendArray {
if imageList[query.uid] == nil {
print("going through iteration")
group.enter()
self.profpicRef.child("profile_pic/" + query.uid + ".jpeg").getData(maxSize: 1
* 1024 * 1024) { (data, error) in
print("accessing image")
if let error = error {
self.imageList[query.uid] = self.defaultImage
} else {
self.imageList[query.uid] = UIImage(data: data!)
}
group.leave()
}
}
}
group.notify(queue: .main) {
print("Images done loading")
}
关于swift - Firebase Storage下载在第一次运行时未快速完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51325963/