Nano Hash - криптовалюты, майнинг, программирование

Swift и Firebase — не синхронизированы после isPersistenceEnabled

У меня проблема с соединением между моим приложением и базой данных firebase. После добавления:

Database.database().isPersistenceEnabled = true

Для моего AppDelegate некоторые данные не синхронизированы. Чтобы получить свои данные, я использую:

self.ref?.child("Stores").observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let store = Store()
            store.Latitude = dictionary["Latitude"]?.doubleValue
            store.Longitude = dictionary["Longitude"]?.doubleValue
            store.Store = dictionary["Store"] as? String
            store.Status = dictionary["Status"] as? String
            stores.append(store)

            DispatchQueue.main.async {
                self.performSegue(withIdentifier: "LogInToMain", sender: nil)
            }
        }
    })

И на следующем ViewController я использую дату, чтобы делать аннотации на карте. Как это:

func createAnnotation(Latitude:Double, Longitude:Double, Store:String, Status:String) {
    let annotation = CustomPointAnnotation()
    let latitude: CLLocationDegrees = Latitude
    let longitude: CLLocationDegrees = Longitude
    annotation.coordinate = CLLocationCoordinate2DMake(latitude, longitude)
    annotation.title = Store
    annotation.imageName = "\(Status).png"
    map.addAnnotation(annotation)
}

Но проблема в том, что данные в аннотации больше не меняются в базе данных. Приложение необходимо открыть, затем закрыть, а затем снова открыть, прежде чем данные отобразятся правильно. Кто-нибудь может помочь с этой проблемой?


  • В данный момент я сам решаю проблемы с Firebase. Я думаю, вы можете обнаружить, что ваш блок наблюдения вызывается несколько раз с включенным сохранением. Первый раз вернет значение из локального хранилища, второй — с сервера. 09.01.2018
  • firebase.google.com/docs/database/admin/retrieve-data Это событие запускается один раз для каждого существующего дочернего элемента, а затем снова каждый раз, когда новый дочерний элемент добавляется к указанному пути. Я бы использовал .childChanged или .value в следующем VC. Кстати, @PeterHaddad упоминает наблюдениеSingleEventOfType, но, по моему опыту, в большинстве случаев это определенно не даст вам последнего результата. 10.01.2018

Ответы:


1

Поскольку вы используете:

Database.database().isPersistenceEnabled = true

тогда вам нужно использовать keepSynced(true), чтобы данные оставались синхронизированными.

Поведение сохранения:

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

keepSynced(true):

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

для получения дополнительной информации проверьте это: https://firebase.google.com/docs/database/ios/offline-capabilities

09.01.2018
  • Благодарю вас! Я добавил: (к viewDidLoad() в начальном ViewController) пусть storeRef = Database.database().reference(withPath: Stores) storeRef.keepSynced(true) Но проблема все еще существует :'( 09.01.2018
  • Вы нашли какое-нибудь решение? 27.02.2019
  • откуда мы должны вызывать Database.database().isPersistenceEnabled = true ..... в func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {} ИЛИ ? 31.03.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..