使用 Core Data 从 Cloud Firestore 提取数据后保存空数据模型

Saving empty data model after pulling data from Cloud Firestore with Core Data

我遇到的问题是 Core Data 在与 Firestore 数据库通信后没有正确保存。我想将每个 post 的用户图像和名称存储在缓存中以提高性能。目前,我有两个名为 UsersPostItem 的数据模型。 Users 是处理我要保存的用户数据的那个。我成功地实施了 PostItem,但没有实施 Users

我认为它与 Firestore 有关系,但不完全确定。代码:

     private var userName = String()
        private var imageLink = String()
        private var db = Firestore.firestore().collection("users")
        
        func fetchUser(_ id: String) -> String {
            db.document(id).getDocument { (snap, err) in
                if let snap = snap, snap.exists {
                    self.userName = snap.data()!["userName"] as! String
                } else {
                    print("Document does not exist")
                }
            }
            print("DB: \(self.userName)")
            return self.userName
        }
        
        func fetchUserImage(_ id: String) -> String {
            db.document(id).getDocument { (snap, err) in
                if let snap = snap, snap.exists {
                    self.imageLink = snap.data()!["image"] as? String ?? ""
                }else{
                    print("Document does not exist")
                }
            }
            print("DB: \(self.imageLink)")
            return self.imageLink
        }
        
        func setUpPosts(managedObjectContext: NSManagedObjectContext) {
            if !self.newposts.isEmpty{
                for i in self.newposts{
                    let user = Users(context: managedObjectContext)
                    print("Fetched Name: \(self.fetchUser(i.user))")
                    user.name = self.userName
                    print("Fetched Image: \(self.fetchUserImage(i.user))")
                    user.image = self.fetchUserImage(i.user)
                    user.uuid = i.user
                    
                    let post = PostItem(context: managedObjectContext)
                    post.type = i.type
                    post.user = i.user
                    post.image = i.thumb
                    post.id = i.id
                    post.text = i.text
                    post.comment = i.comments
                    post.video = i.media
                    do{
                        try managedObjectContext.save()
                    }catch{
                        print(error)
                    }
                    self.clearNewPosts()
                }
            }
        }

setUpPosts() 从 class 的初始值设定项中调用,处理视图的所有 post 数据。

大多数 Firebase 调用都是异步的。在您的代码中,db.document(id).getDocument 是一个异步调用,因此当您从 fetchUser/[ 中 return 时,self.userNameself.imageLink 将为空/nil =15=].

Firestore 无论如何都使用本地缓存(来自 docs:“对于 Android 和 iOS,默认情况下启用离线持久性。”),所以我不推荐实现你自己的缓存。

对于缓存图像,我建议查看 iOS 的 FirebaseUI - 提供了一个 integration with SDWebImage,它将为您处理缓存。