【问题标题】:Firestore Listener Document ChangesFirestore 侦听器文档更改
【发布时间】:2020-01-07 12:57:54
【问题描述】:

我正在尝试为文档的更改创建一个侦听器。当我更改 Firestore(服务器)中的数据时,它不会在 TableView(应用程序)中更新。 TableView 仅在我重新打开 App 或 ViewController 时更新。

我已经能够为查询快照设置此设置,但不能为文档快照设置。

谁能看看下面的代码,看看为什么它没有实时更新?

    override func viewDidAppear(_ animated: Bool) {

    var newDocIDString = newDocID ?? ""


    detaliPartNumberListerner = firestore.collection(PARTINFO_REF).document(newDocIDString).addSnapshotListener { documentSnapshot, error in
        guard let document = documentSnapshot else {
                print("Error fetching document: \(error!)")
                return
            }
            guard let data = document.data() else {
                print("Document data was empty.")
                return
            }
            print("Current data: \(data)")
        self.partInfos.removeAll()
        self.partInfos = PartInfo.parseData2(snapshot: documentSnapshot)
        self.issueTableView.reloadData()

    }

在我的 PartInfo 文件中

    class func parseData2(snapshot: DocumentSnapshot?) -> [PartInfo] {
    var partNumbers = [PartInfo]()


    guard let snap = snapshot else { return partNumbers }
    //for document in snap.documents {
      //  let data = document.data()

        let area = snapshot?[AREA] as? String ?? "Not Known"

        let count = snapshot?[COUNT] as? Int ?? 0


        //let documentId = document.documentID
    let documentId = snapshot?.documentID ?? ""

        let newPartInfo = PartInfo(area: area, count: count, documentId: documentId)

        partNumbers.append(newPartInfo)

    return partNumbers
}

【问题讨论】:

  • 您能描述一下您从代码中的日志记录中看到的内容吗?什么时候?当 vc 首次出现时,您是否看到“当前数据...”,然后在数据更新时再次出现?
  • 你在观察者块中放了断点吗?
  • 嗨 Lara,这是我的 tableView 的问题。当我通过 Firestore(服务器)进行更改时,侦听器会捕获数据并将其显示在打印代码中。它没有更新我的 TableView。只有当我返回 1 视图并租用视图时,它才会更新
  • 抱歉,我在 ViewDidLoad 中创建了一个变量并在 cellForRowAt 中使用了它,所以我的更改永远不会被调用。我还没有测试它是否有效,但我确信它会。
  • 其实这并没有什么不同。它仍然没有更新我的 TableView...

标签: swift firebase google-cloud-firestore listener


【解决方案1】:

UI 工作必须始终在主线程上完成。因此,不要在第一个代码 sn-p 中使用最后一行,而是这样做:

DispatchQueue.main.async {
    self.issueTableView.reloadData()
}

我认为这可能是您的问题的解决方案。 (有点晚了,我知道……)

【讨论】:

    猜你喜欢
    • 2020-12-24
    • 2020-01-24
    • 2021-04-07
    • 2021-03-16
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2021-06-07
    相关资源
    最近更新 更多