繁体   English   中英

我无法获取数组并从 Firebase 存储中放入另一个数组 swift

[英]I can't get array and put in the another array swift from Firebase storage

我想从 Firebase 存储中获取文件夹和图像。 在这段代码上,除了片刻之外,所有的工作。 我不能在数组 self.collectionImagesArray 中使用 append 数组 self.collectionImages。 我没有错误,但数组 self.collectionImagesArray 是空的

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是一个异步操作,因为它需要调用服务器。 在进行该调用时,您的主要代码会继续运行,以便用户可以继续使用该应用程序。 然后,当服务器返回一个值时,将调用您的闭包/完成处理程序,将 URL 添加到数组中。 所以你的print("\(self.collectionImagesArray)")发生在self.collectionImages.append(img)被调用之前。

您还可以按照打印语句在 output 中出现的顺序看到这一点。您将首先看到完整的空数组,然后才看到print("\(self.collectionImages)")输出。

此问题的解决方案始终相同:您需要确保仅在所有 URL 都已添加到数组后才使用该数组。 有很多方法可以做到这一点,但一个简单的方法是检查您的 URL 数组是否与回调中的result.items长度相同:

...
self.collectionImages.append(img)
if self.collectionImages.count == result.items.count {
    self.collectionImagesArray.append(self.collectionImages)
    print("\(self.collectionImagesArray)")
}

另见:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM