我无法从 Firebase 存储中获取数组并放入另一个数组 swift
I can't get array and put in the another array swift from Firebase storage
我想从 Firebase 存储中获取文件夹和图像。在这段代码上,除了片刻之外,所有的工作。我无法在数组 self.collectionImages 数组中追加数组 self.collectionImages。我没有错误,但数组 self.collectionImages数组为空
class CollectionViewModel: ObservableObject {
@Published var collectionImagesArray: [[String]] = [[]]
@Published var collectionImages = [""]
init() {
var db = Firestore.firestore()
let storageRef = Storage.storage().reference().child("img")
storageRef.listAll { (result, error) in
if error != nil {
print((error?.localizedDescription)!)
}
for prefixName in result.prefixes {
let storageLocation = String(describing: prefixName)
let storageRefImg = Storage.storage().reference(forURL: storageLocation)
storageRefImg.listAll { (result, error) in
if error != nil {
print((error?.localizedDescription)!)
}
for item in result.items {
// List storage reference
let storageLocation = String(describing: item)
let gsReference = Storage.storage().reference(forURL: storageLocation)
// Fetch the download URL
gsReference.downloadURL { url, error in
if let error = error {
// Handle any errors
print(error)
} else {
// Get the download URL for each item storage location
let img = "\(url?.absoluteString ?? "placeholder")"
self.collectionImages.append(img)
print("\(self.collectionImages)")
}
}
}
self.collectionImagesArray.append(self.collectionImages)
print("\(self.collectionImagesArray)")
}
//
self.collectionImagesArray.append(self.collectionImages)
}
}
}
如果我把 self.collectionImagesArray.append(self.collectionImages) 放在闭包中它的作品,但它不是我想要的
问题是由于调用 downloadURL
是一个异步操作,因为它需要调用服务器。在进行该调用时,您的主要代码会继续运行,以便用户可以继续使用该应用程序。然后当服务器 returns 一个值时,你的 closure/completion 处理程序被调用,它将 URL 添加到数组中。所以你的 print("\(self.collectionImagesArray)")
发生在 self.collectionImages.append(img)
被调用之前。
您还可以按照打印语句在输出中出现的顺序看到这一点。您将首先看到完整的空数组,然后才看到 print("\(self.collectionImages)")
输出。
此问题的解决方案始终相同:您需要确保仅在添加了所有 URL 后才使用该数组。有很多方法可以做到这一点,但一个简单的方法是检查 URLs 的数组是否与回调中的 result.items
的长度相同:
...
self.collectionImages.append(img)
if self.collectionImages.count == result.items.count {
self.collectionImagesArray.append(self.collectionImages)
print("\(self.collectionImagesArray)")
}
另见:
- Return image from asynchronous call
我想从 Firebase 存储中获取文件夹和图像。在这段代码上,除了片刻之外,所有的工作。我无法在数组 self.collectionImages 数组中追加数组 self.collectionImages。我没有错误,但数组 self.collectionImages数组为空
class CollectionViewModel: ObservableObject {
@Published var collectionImagesArray: [[String]] = [[]]
@Published var collectionImages = [""]
init() {
var db = Firestore.firestore()
let storageRef = Storage.storage().reference().child("img")
storageRef.listAll { (result, error) in
if error != nil {
print((error?.localizedDescription)!)
}
for prefixName in result.prefixes {
let storageLocation = String(describing: prefixName)
let storageRefImg = Storage.storage().reference(forURL: storageLocation)
storageRefImg.listAll { (result, error) in
if error != nil {
print((error?.localizedDescription)!)
}
for item in result.items {
// List storage reference
let storageLocation = String(describing: item)
let gsReference = Storage.storage().reference(forURL: storageLocation)
// Fetch the download URL
gsReference.downloadURL { url, error in
if let error = error {
// Handle any errors
print(error)
} else {
// Get the download URL for each item storage location
let img = "\(url?.absoluteString ?? "placeholder")"
self.collectionImages.append(img)
print("\(self.collectionImages)")
}
}
}
self.collectionImagesArray.append(self.collectionImages)
print("\(self.collectionImagesArray)")
}
//
self.collectionImagesArray.append(self.collectionImages)
}
}
}
如果我把 self.collectionImagesArray.append(self.collectionImages) 放在闭包中它的作品,但它不是我想要的
问题是由于调用 downloadURL
是一个异步操作,因为它需要调用服务器。在进行该调用时,您的主要代码会继续运行,以便用户可以继续使用该应用程序。然后当服务器 returns 一个值时,你的 closure/completion 处理程序被调用,它将 URL 添加到数组中。所以你的 print("\(self.collectionImagesArray)")
发生在 self.collectionImages.append(img)
被调用之前。
您还可以按照打印语句在输出中出现的顺序看到这一点。您将首先看到完整的空数组,然后才看到 print("\(self.collectionImages)")
输出。
此问题的解决方案始终相同:您需要确保仅在添加了所有 URL 后才使用该数组。有很多方法可以做到这一点,但一个简单的方法是检查 URLs 的数组是否与回调中的 result.items
的长度相同:
...
self.collectionImages.append(img)
if self.collectionImages.count == result.items.count {
self.collectionImagesArray.append(self.collectionImages)
print("\(self.collectionImagesArray)")
}
另见:
- Return image from asynchronous call