Firebase 存储下载在第一个 运行 swift 中未完成
Firebase Storage download not going through in the first run swift
这是我用来从 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")
}
这是我用来从 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")
}