ObserveSingleEvent mengembalikan data lama

Saya ingin mengambil nomor versi aplikasi yang diperlukan saat aplikasi dimulai. Tapi saya tidak bisa mendapatkan kunci yang tepat.

Saya memiliki kode ini untuk diambil. Saya menggunakan observasi acara tunggal karena saya menggunakan metode ini untuk memeriksa nomor versi aplikasi yang diperlukan. Metode ini hanya diaktifkan ketika aplikasi mulai melakukan pemeriksaan.

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

Tapi itu mengembalikan hasil lama? Saya telah mengaktifkan isPersistenceEnabled di Appdelegate saya.

Ini adalah struktur databasenya:

masukkan deskripsi gambar di sini

Saya tidak mendapatkan hasil saat menggunakan Database.database().reference().child("version").child("IOS"). snapshot.exists salah saat saya menggunakannya.

Yang saya miliki sebelumnya adalah: - versi | iOS - 1.0

Dan saya mendapatkan hasil ketika saya menggunakan Database.database().reference().child("version"), namely {iOS => 1.0}. Saya tidak mengerti karena itu adalah struktur lama saya.


person da1lbi3    schedule 28.07.2017    source sumber
comment
Jika isPersistenceEnabled disetel ke true, pengamat mengambil data dari penyimpanan lokal terlebih dahulu. Karena observeSingleEventOfType dimaksudkan untuk mengamati hanya sekali, ia hanya akan mengambil data dari penyimpanan lokal.   -  person Muhammad Hassan    schedule 28.07.2017
comment
@MuhammadHassan Apakah ada cara untuk memuat ulang data secara paksa?   -  person da1lbi3    schedule 28.07.2017


Jawaban (2)


Firebase Realtime Database menyinkronkan dan menyimpan salinan data lokal untuk pemroses aktif. Selain itu, Anda dapat menyinkronkan lokasi tertentu.

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

Klien Firebase Realtime Database secara otomatis mendownload data di lokasi ini dan tetap menyinkronkannya meskipun referensi tidak memiliki pendengar aktif. Anda dapat mematikan kembali sinkronisasi dengan baris kode berikut.

scoresRef.keepSynced(false)

Belum benar-benar mencobanya tetapi seharusnya berhasil.

person Muhammad Hassan    schedule 28.07.2017
comment
Apakah itu berarti Anda memiliki koneksi konstan ke Firebase padahal itu benar? Hanya ingin tahu karena Anda hanya diperbolehkan 100 koneksi simultan pada tingkat gratis. @Muhammad Hassan - person Jan-Dawid Roodt; 13.11.2018
comment
Belum membaca dokumen Firebase akhir-akhir ini tetapi basis pengguna pada tingkat gratis melampaui 500 di salah satu aplikasi (yang telah saya kerjakan) tanpa keluhan. - person Muhammad Hassan; 13.11.2018
comment
Oh wow, apakah Anda yakin itu koneksi simultan? Jika Anda membuka firebase -› Database -› Usage, apakah di sana tertulis 500 atau yang Anda maksud adalah pengguna? (Bagaimanapun, selamat! haha) - person Jan-Dawid Roodt; 14.11.2018

Metode observeSingleEvent digunakan untuk data yang tidak benar-benar berubah, dan karena itu akan diambil dari cache lokal jika persistensi Anda diaktifkan.

Solusi Android ini (https://stackoverflow.com/a/40477280/883413) memberikan solusi dengan menggunakan metode alternatif , runTransactonBlock.

Transaksi memberikan kesempatan untuk mengedit data apa pun sebelum disimpan. Di sini, kita cukup menerima data sebagai kebenaran karena kita hanya tertarik membaca nilai terbaru.

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)
        }
    }
})
person Ric Santos    schedule 28.08.2017