【问题标题】:How to populate loaded records from firebase?如何从firebase填充加载的记录?
【发布时间】:2020-12-07 10:23:32
【问题描述】:

我编写了从 firebase 加载记录的函数,但出现错误

转义闭包捕获变异的“自我”参数

函数写法如下:

let db = Firestore.firestore()
@State var libraryImages: [LibraryImage] = []

mutating func loadImages() {
        libraryImages = []
        
        db.collection(K.FStore.CollectionImages.collectionName).getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                if let snapshotDocuments = querySnapshot?.documents {
                    for document in snapshotDocuments {
                        let documentData = document.data()
                        let title: String = documentData[K.FStore.CollectionImages.title] as! String
                        let thumbnailUrl: String = documentData[K.FStore.CollectionImages.thumbnailUrl] as! String
                        let svgUrl: String = documentData[K.FStore.CollectionImages.svgUrl] as! String
                        let libraryImageItem = LibraryImage(title: title, thumbnailUrl: thumbnailUrl, svgUrl: svgUrl)
                        self.libraryImages.append(libraryImageItem)
                    }
                }
            }
        }
    }

有谁知道导致错误的原因以及如何消除它?

【问题讨论】:

    标签: swift firebase google-cloud-firestore swiftui


    【解决方案1】:

    将所有这些移动到引用类型视图模型中,并将其用作视图中的观察对象

    这是一个可能的方法的演示:

    struct DemoView: View {
      @ObservedObject var vm = ImagesViewModel()
    //  @StateObject var vm = ImagesViewModel()       // << SwiftUI 2.0
    
      var body: some View {
         Text("Loaded images: \(vm.libraryImages.count)")
           .onAppear {
               self.vm.loadImages()
           }
      }
    }
    
    
    class ImagesViewModel: ObservableObject {
        let db = Firestore.firestore()
        @Published var libraryImages: [LibraryImage] = []
    
        func loadImages() {
            libraryImages = []
    
            db.collection(K.FStore.CollectionImages.collectionName).getDocuments() { (querySnapshot, err) in
                if let err = err {
                    print("Error getting documents: \(err)")
                } else {
                    if let snapshotDocuments = querySnapshot?.documents {
                        var images = [LibraryImage]()
                        for document in snapshotDocuments {
                            let documentData = document.data()
                            let title: String = documentData[K.FStore.CollectionImages.title] as! String
                            let thumbnailUrl: String = documentData[K.FStore.CollectionImages.thumbnailUrl] as! String
                            let svgUrl: String = documentData[K.FStore.CollectionImages.svgUrl] as! String
                            let libraryImageItem = LibraryImage(title: title, thumbnailUrl: thumbnailUrl, svgUrl: svgUrl)
                            images.append(libraryImageItem)
                        }
    
                        DispatchQueue.main.async {
                            self.libraryImages = images
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 2020-10-11
      • 2022-10-13
      • 2019-07-03
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      相关资源
      最近更新 更多