Firebase runTransactionBlock无法在swift 3中运行

时间:2016-09-29 06:35:11

标签: ios swift firebase firebase-realtime-database swift3

更新Xcode 8并将Swift 2项目转换为Swift 3后,其他代码运行良好,但runTransactionBlock无效,发现此错误:

  

“runTransactionBlock:启用持久性时检测到的使用情况。请注意,应用程序重新启动后不会持续存在

可能出现什么问题?

Firebase runTransaction Code

postRef.runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in
            if var post = currentData.value as? [String : AnyObject], let uid = FIRAuth.auth()?.currentUser?.uid {
                var stars : Dictionary<String, Bool>
                stars = post["likeMap"] as? [String : Bool] ?? [:]
                var likeCount = post["likeCount"] as? Int ?? 0
                if let _ = stars[uid] {
                    // Unstar the post and remove self from stars
                    likeCount -= 1
                    self._liked = false
                    stars.removeValue(forKey: uid)
                } else {
                    // Star the post and add self to stars
                    likeCount += 1
                    self._liked = true
                    stars[uid] = true
                }
                post["likeCount"] = likeCount as AnyObject?
                post["likeMap"] = stars as AnyObject?
                self._likeCount = likeCount
                // Set value and report transaction success
                currentData.value = post

                return FIRTransactionResult.success(withValue: currentData)
            }
            return FIRTransactionResult.success(withValue: currentData)
        }) { (error, committed, snapshot) in
            if let error = error {
                print(error.localizedDescription)
            }
        }

3 个答案:

答案 0 :(得分:5)

不确定您使用的是哪个版本的Firebase SDK,但我会为您提供一个成功使用 runTransactionBlock 的基本示例:

数据库

enter image description here

代码

ToString()

注意

我已使用Firebase SDK版本: 3.0.1 ,您可以使用以下方法从代码中获取此信息:GetItemText()

答案 1 :(得分:2)

该消息警告您的应用正在使用事务将数据保存到磁盘。

启用磁盘持久性时,应用程序观察到的(最近)数据将持久保存到磁盘。这样,如果用户在没有网络连接的时刻重新启动应用程序,数据将可用。

在此已断开连接的状态下,Firebase客户端还将在所谓的挂起写入队列中将所有本地写入操作存储到磁盘。然后,当网络连接再次可用时,Firebase客户端将向服务器发送所有挂起的写入,当然还会接收服务器为其提供的任何更新。

但是,在断开连接时,Firebase客户端将将事务持久保存到磁盘。由于该组合可能与您的预期不符,因此Firebase会记录您所看到的有关它的警告。

答案 2 :(得分:0)

我有同样的问题,我找到了解释和解决方案。

Firebase文档中的示例对于Swift 3来说是错误的,因为它表示来自数据库的FIRMutableData对象的类型为[String:AnyObject],而应该是[String:Any]。

原因是响应实际上是[String:Dictionary]而Dictionary不是AnyObject(Any可以表示任何类型的实例,包括函数类型和可选类型。 AnyObject可以表示任何类类型的实例。)因为Dictionary不是类。

为了使该代码有效,您必须替换这行代码:

if var post = currentData.value as? [String : AnyObject], let uid = FIRAuth.auth()?.currentUser?.uid {

这一行:

if var post = currentData.value as? [String : Any], let uid = FIRAuth.auth()?.currentUser?.uid {