Firestore - iOS快照侦听器错误 - 引用的事务已过期或不再有效

时间:2017-10-12 13:04:50

标签: ios swift firebase google-cloud-firestore

更新 - 2018年1月13日

如果有人仍在关注此事,那么Firebase还没有修复它。

作为一种解决方法,我一直在检查从快照侦听器返回的错误是否与下面提到的两个错误消息之一匹配,如果是,我重新连接监听器。绝对不理想,但至少它有助于保证我的听众在我期望他们活跃的时候无法随意过期。

这里有一些示例代码,可以帮助任何人遇到此问题:

class FirestoreListener {

    var firestoreReg: ListenerRegistration?

    func shouldReattach(for error: Error) -> Bool {
        return error.localizedDescription == "The referenced transaction has expired or is no longer valid." ||
            error.localizedDescription == "transaction closed"
    }

    func addListener() {

        let doc = Firestore.firestore().collection("foo").document("bar")
        self.firestoreReg?.remove()
        self.firestoreReg = doc.addSnapshotListener { [weak self] snapshot, error in

            guard let strongSelf = self else { return }

            // Catch firestore transaction expired/closed bug
            if let error = error {
                if strongSelf.shouldReattach(for: error) {
                    strongSelf.addListener()
                } else {
                    // Handle other error
                }
                return
            }

            // Do something
        }
    }
}

更新 - 2017年11月23日

我已将此报告为Firebase的错误,他们已承认此问题。他们现在正在修复,但还没有提供ETA。只关注他们的发行说明:

https://firebase.google.com/support/releases

我最近开始将我的iOS Swift代码从原始的Firebase RTDB迁移到新的Firestore(Beta),并且我遇到了一个从未在RTDB中发生的问题。

更新

错误似乎是在我的所有addSnapshotListener方法中随机发生的。基本上在添加一个监听器之后,每隔一段时间它就会被触发(尽管没有对数据库进行任何更改)并且会返回错误。一旦发生这种情况,监听器似乎变得无效,不再监听更改。

错误本地化描述:

  

引用的交易已过期或不再有效。

Google搜索错误消息会返回一些与Google Cloud Platform相关的帖子,但我无法找到专门针对Firebase Firestore的内容。任何有关这方面的帮助将非常感激。我在下面添加了一些示例代码,但实际上我已经看到这种情况在我在我的应用程序中使用的几乎所有快照侦听器方法中随机发生。

示例代码:

Firestore.firestore().collection("foo").document("bar").addSnapshotListener { snapshot, error in

    guard let snapshot = snapshot, snapshot.exists else {
        if let error = error {
            print("ERROR Reading /foo/bar with error message: \(error.localizedDescription)")
        }
        methodB()
        return
    }

    guard let dict = snapshot.data() as? [String: String], let value = dict["key"] else {
        print("WARNING - No value for 'key' in dictionary")
        methodB()
        return
    }

    // Check database value for 'key' matches 'someValue'
    if value == "someValue" {
        print("Success, returned value matches 'someValue'")
        methodA()
    } else {
        print("WARNING - value for 'key' in dictionary does not match 'someValue'")
        methodB()
    }
}

似乎不只是iOS SDK出现了这个错误:

Error in onSnapshot: FirebaseError: [code=invalid-argument]: transaction closed

更新

与上面的链接类似,我也注意到很多听众会随机返回,并显示以下错误消息:

  

错误:交易已关闭

到目前为止,Android SDK似乎未受影响。

0 个答案:

没有答案