2016-09-29 10 views
4

迅速に作業し、スウィフト3にスウィフト2プロジェクトを変換しないで、他のコードはうまく動作しますが、runTransactionBlockが動作していないと、このエラーを検出しました:Firebase runTransactionBlockはXcodeの8を更新した後、3

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

何ができますか違う? Firebase SDKのバージョン

Firebase 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

わからないあなたが使用しているが、私はあなたに私が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) 
} 

私はFirebase SDKのバージョンを使用しました。注

3.0.1を、あなたは、このメソッドを使用してコードからこの情報を取得することができます:FIRDatabase.sdkVersion()

+0

マイfirebase SDKのバージョンも3.0.1です – Jelly

2

あなたのアプリがトランザクションを使用しているという警告メッセージは、データをディスクに保存しています。

ディスクの永続性を有効にすると、アプリケーションが監視する(最近の)データはディスクに保存されます。こうすれば、ネットワークに接続されていない瞬間にユーザーがアプリを再起動した場合にデータを利用できるようになります。この

状態を切断し、Firebaseクライアントは、保留中のいわゆるでディスクにすべてのローカル書き込み操作を格納するキューを書き込みます。その後、ネットワーク接続が再び利用可能になると、Firebaseクライアントは保留中のすべての書き込みをサーバに送信します。もちろん、サーバが保持している更新もすべて受信されます。

ただし、切断されている間、Firebaseクライアントはではなく、はディスクへのトランザクションを持続します。その組み合わせは予想したものとは異なる可能性があるため、Firebaseはあなたが見る警告を記録します。

0

私は同じ問題を抱えており、説明と解決策を見つけました。

Swift 3ではデータベースからのFIRMutableDataオブジェクトが[String:AnyObject]であると言われているので、Firebaseのドキュメントの例は間違っています。代わりに[String:Any]にする必要があります。

レスポンスは実際には[String:Dictionary]であり、ディクショナリはAnyObjectではありません(Anyは、関数型とオプションの型を含む任意の型のインスタンスを表すことができます)。 AnyObjectは、型。)辞書はクラスではないためです。

あなたはこのコード行置き換える必要があり、そのコードが動作するためには:この行で

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 { 
関連する問題