2016-09-29 84 views
4

工作更新的Xcode 8和转换斯威夫特2项目进入迅捷3之后,其他代码工作得很好,但runTransactionBlock不工作,发现这个错误:火力地堡runTransactionBlock不迅速3

"runTransactionBlock: usage detected while persistence is enabled. Please be aware that transactions will not be persisted across app restarts"

可能是什么错误?

火力地堡runTransaction代码

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) 
      } 
     } 

回答

5

不知道哪个火力地堡SDK版本您使用,但我会为你提供我以前runTransactionBlock成功一个基本的例子:

数据库

enter image description here


代码

let ref = FIRDatabase.database().reference() 
let refReservations = ref.child("reservations") 


refReservations.runTransactionBlock { (currentData: FIRMutableData) -> FIRTransactionResult in 
    if var data = currentData.value as? [String: Any] { 
    var count = data["count"] as? Int ?? 0 
    count += 1 
    data["count"] = count 

    currentData.value = data 
    } 

    return FIRTransactionResult.success(withValue: currentData) 
} 

我用火力地堡SDK版本:3.0.1,您可以使用此方法从您的代码此信息:FIRDatabase.sdkVersion()

+0

我的火力SDK版本也是3.0.1 – Jelly

2

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

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

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

但是,虽然断开连接,但Firebase客户端将而不是将事务保留到磁盘。由于该组合可能不符合您的预期,Firebase会记录您看到的警告。

0

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

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

原因是响应实际上是[String:Dictionary],而Dictionary不是AnyObject(任何可以表示任何类型的实例,包括函数类型和可选类型 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 {