我有一个从 Firestore 加载数组的 TableView,但是我无法让它成功地离线更新我的 View 。它似乎正在保存更新,但没有检索它们。
这是我启用持久性的尝试:
//In AppDelegate didFinishLaunching
let settings = FirestoreSettings()
settings.isPersistenceEnabled = true
let db = Firestore.firestore()
db.settings = settings
我使用 NSDictionary 保存和检索数据,然后重新加载 TableView。
//Retrieving from Firestore
func loadTasks() {
todoList = []
let db = Firestore.firestore()
guard let currentUser = Auth.auth().currentUser else {
return
}
// Get tasks by User ID
db.collection("tasks").whereField("user_id", isEqualTo: currentUser.uid)
.getDocuments() { (querySnapshot, err) in
MBProgressHUD.hide(for: self.view, animated: true)
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
let task: Task = self.convertDictionaryToTask(document.data() as NSDictionary)
self.taskList.append(task)
}
}
}
//Saving to Firestore
func updateTask(_ task: Task) {
let db = Firestore.firestore()
guard let currentUser = Auth.auth().currentUser else {
return
}
let dicTask = convertTaskToDictionary(task)
// Update a task
db.collection("tasks").document(currentUser.uid + "_" + task.taskId).updateData([
"task": dicTask
]) { err in
if let err = err {
print("Error writing document: \(err)")
} else {
print("Document successfully written!")
}
self.loadTasks()
}
}
谢谢!
最佳答案
调用 updateData
的完成处理程序只会在服务器接受或拒绝数据后调用。在此之前,数据将在缓存中的客户端可用,但不会调用您的完成处理程序,因此 self.loadTasks()
永远不会发生。
你有两个选择:
在调用
updateData(...)
之后立即调用self.loadTasks()
。如果更新本地缓存失败,updateData(...)
调用将引发错误。因此,如果该调用没有引发错误,数据将保存在本地。db.collection("tasks").document(currentUser.uid + "_" + task.taskId).updateData([ "task": dicTask ]) { err in if let err = err { print("Error writing document on server: \(err)") } else { print("Document successfully written on server!") } } self.loadTasks()
使用
onSnapshot
监听器,而不是getDocuments
,如 listening for realtime updates 上的文档中所示.当本地缓存更新时,将立即调用此类监听器,并可能在服务器处理更新后再次调用(例如:如果服务器拒绝它)。
关于ios - Firestore 离线未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57763862/