我无法从 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.collectionImagesA​​rray.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