使用 Core Data 从 Cloud Firestore 提取数据后保存空数据模型
Saving empty data model after pulling data from Cloud Firestore with Core Data
我遇到的问题是 Core Data 在与 Firestore 数据库通信后没有正确保存。我想将每个 post 的用户图像和名称存储在缓存中以提高性能。目前,我有两个名为 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, 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.userName
和 self.imageLink
将为空/nil
=15=].
Firestore 无论如何都使用本地缓存(来自 docs:“对于 Android 和 iOS,默认情况下启用离线持久性。”),所以我不推荐实现你自己的缓存。
对于缓存图像,我建议查看 iOS 的 FirebaseUI - 提供了一个 integration with SDWebImage,它将为您处理缓存。
我遇到的问题是 Core Data 在与 Firestore 数据库通信后没有正确保存。我想将每个 post 的用户图像和名称存储在缓存中以提高性能。目前,我有两个名为 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, 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.userName
和 self.imageLink
将为空/nil
=15=].
Firestore 无论如何都使用本地缓存(来自 docs:“对于 Android 和 iOS,默认情况下启用离线持久性。”),所以我不推荐实现你自己的缓存。
对于缓存图像,我建议查看 iOS 的 FirebaseUI - 提供了一个 integration with SDWebImage,它将为您处理缓存。