问题描述
我遇到的问题是与Firestore数据库通信后,Core Data无法正确保存。我想将每个帖子的用户图像和名称存储在缓存中以提高性能。目前,我有两个名为Users
和PostItem
的数据模型。 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,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()
是在处理所有视图数据的类的初始化器中调用的。
解决方法
大多数Firebase调用是异步的。在您的代码中,db.document(id).getDocument
是一个异步调用,因此当您从self.userName
/ self.imageLink
返回时,nil
和fetchUser
将为空/ fetchUserImage
Firestore始终使用本地缓存(来自docs:“对于Android和iOS,默认情况下启用了离线持久性。”),所以我不建议您实现自己的缓存。
对于缓存图像,我建议看一下iOS的FirebaseUI-它提供了integration with SDWebImage,它将为您处理缓存。