2017-07-28 15 views
3

アプリの起動時に必要なアプリケーションのバージョン番号を取得したい。しかし、私は正しい鍵を得ることができません。ObserveSingleEventが古いデータを返す

私はこのコードを取得しました。このメソッドを使用して必要なアプリケーションのバージョン番号を確認するため、私は単一のイベントを使用します。このメソッドは、アプリケーションがチェックを開始するときにのみ起動されます。

func getVersion(completionHandler: @escaping (Result<Any?>) ->()) { 

    let ref: DatabaseReference! = Database.database().reference().child("version").child("IOS") 

    ref?.observeSingleEvent(of: .value , with: { snapshot in 

     if snapshot.exists() {  
      let recent = snapshot.value as! NSDictionary 
      print(recent) 
     } 
    }) 
} 

しかし、古い結果が返されますか?私はisPersistenceEnabledAppdelegateで有効にしました。

これは、データベースの構造です:

enter image description here

私はDatabase.database().reference().child("version").child("IOS"). snapshot.existsを使用する場合、私は何の結果を得るていない私はそれを使用する場合はfalseです。

私が以前に持っていたものは次のとおりでした: - バージョン | IOS - 1.0

Database.database().reference().child("version"), namely {iOS => 1.0}を使用すると結果が得られます。それは私の古い構造だったので、私はそれを取得しません。

+0

'isPersistenceEnabled'がtrueに設定されている場合、オブザーバーは最初にローカルストレージからデータをフェッチします。 'observeSingleEventOfType'は一度しか観察されないため、ローカルストレージからデータを取得します。 –

+0

@MuhammadHassan強制的にデータをリロードする方法はありますか? – da1lbi3

答えて

2

Firebase Realtime Databaseは、アクティブなリスナーのデータのローカルコピーを同期して保存します。さらに、特定の場所を同期させることができます。

let scoresRef = Database.database().reference(withPath: "scores") 
scoresRef.keepSynced(true) 

Firebaseリアルタイムデータベースクライアントが自動的に参照がアクティブなリスナーを持っていない場合でも、これらの場所でデータをダウンロードし、同期して、それを保持します。次のコード行で同期をオフに戻すことができます。

scoresRef.keepSynced(false) 

は実際にそれを試していないが、それは動作するはずです。

0

observeSingleEventメソッドは、実際には変更されないデータに使用され、永続性を有効にしている場合はローカルキャッシュからフェッチします。

このAndroidソリューション(https://stackoverflow.com/a/40477280/883413)は、別の方法(runTransactonBlock)を使用して回避策を提供しています。

トランザクションは、保存する前にデータを編集する機会を与えます。ここでは、最新の値を読むことだけに興味のあるデータを正しいものとして受け入れることができます。

let ref: DatabaseReference! = Database.database().reference().child("version").child("IOS") 
ref.runTransactionBlock({ (data) -> TransactionResult in 
    return TransactionResult.success(withValue: data) 

}, andCompletionBlock: { (error, success, snapshot) in 
    if let snapshot = snapshot, snapshot.exists() { 
     if let recent = snapshot.value as? NSDictionary { 
      print(recent) 
     } 
    } 
}) 
関連する問題