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

Но он возвращает старые результаты? У меня включен isPersistenceEnabled на моем Appdelegate.

Это структура базы данных:

введите здесь описание изображения

Я не получаю результатов, когда использую Database.database().reference().child("version").child("IOS"). snapshot.exists имеет значение false, когда я использую это.

Раньше у меня было: - версия | iOS-1.0

И я получаю результат, когда использую Database.database().reference().child("version"), namely {iOS => 1.0}. Я не понимаю, потому что это была моя старая структура.


person da1lbi3    schedule 28.07.2017    source источник
comment
Когда для isPersistenceEnabled установлено значение true, наблюдатели сначала извлекают данные из локального хранилища. Поскольку observeSingleEventOfType предназначен для наблюдения только один раз, он будет извлекать данные только из локального хранилища.   -  person Muhammad Hassan    schedule 28.07.2017
comment
@MuhammadHassan Есть ли способ принудительно перезагрузить данные?   -  person da1lbi3    schedule 28.07.2017


Ответы (2)


База данных Firebase Realtime синхронизирует и сохраняет локальную копию данных для активных слушателей. Кроме того, вы можете синхронизировать определенные местоположения.

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

Клиент базы данных Firebase Realtime автоматически загружает данные из этих расположений и поддерживает их синхронизацию, даже если ссылка не имеет активных слушателей. Вы можете отключить синхронизацию с помощью следующей строки кода.

scoresRef.keepSynced(false)

На самом деле не пробовал, но должно сработать.

person Muhammad Hassan    schedule 28.07.2017
comment
Означает ли это, что у вас есть постоянное подключение к Firebase, пока это правда? Просто интересно, потому что на бесплатном уровне разрешено только 100 одновременных подключений. @Мухаммад Хассан - person Jan-Dawid Roodt; 13.11.2018
comment
В последнее время не просматривал документы Firebase, но пользовательская база на бесплатном уровне превысила 500 в одном из приложений (над которыми я работал) без каких-либо жалоб. - person Muhammad Hassan; 13.11.2018
comment
Ух ты, вы уверены, что это были одновременные соединения? Если вы зайдете в firebase -> База данных -> Использование, там написано 500 или вы имеете в виду пользователей? (В любом случае поздравляю! ха-ха) - person Jan-Dawid Roodt; 14.11.2018

Метод 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)
        }
    }
})
person Ric Santos    schedule 28.08.2017