ios - Firestore 离线未更新

标签 ios swift firebase google-cloud-firestore

我有一个从 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() 永远不会发生。

你有两个选择:

  1. 在调用 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()
    
  2. 使用 onSnapshot 监听器,而不是 getDocuments,如 listening for realtime updates 上的文档中所示.当本地缓存更新时,将立即调用此类监听器,并可能在服务器处理更新后再次调用(例如:如果服务器拒绝它)。

关于ios - Firestore 离线未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57763862/

相关文章:

ios - 如何在 tvOS 的同一 View 中显示 UISearchController?

swift - 对于需要返回的函数,为什么不在 for 循环内的 if-else 语句中返回就足够了?

ios - 由于未捕获的异常 'NSInternalInconsistencyException' 而终止应用程序,原因 : 'FCM error: cannot have last checkin timestamp in future'

iOS - 应用程序界面在网络调用期间启动时卡住

ios - 同一 Appium session 上的多个 iOS 模拟器

ios - 区分触摸计数SKSpriteNode

ios - CPTBarPlot - barTip 和 barBase 属性

firebase - 使用 Dart .sort() 函数对 AsyncSnapshot<QuerySnapshot<Object?>> 中的 Firebase 数据进行排序

javascript - 类型 'auth'/home/kartik/Desktop/Ecommerce/ecommerce/node_modules/firebase/index") 上不存在属性 'typeof import("")'.ts(2339)

iphone - 如何防止 UIScrollView 滚动两个页面?