Parse Platform Online режим и откат для автономного режима, если время ожидания / проблема с сетью - PullRequest
0 голосов
/ 04 ноября 2019

Есть ли в Parse Platform способ возврата к локальному хранилищу данных, если нет соединения?

Я понимаю, что есть pin / pinInBackground, поэтому я могу прикрепить любой объект к LocalDataStore.

Затем я могу запросить у localdatastore эту информацию.

Однако я всегда хочу сначала попытаться получить данные сервера, а в случае неудачи получить локальные данные.

Есть ли способ сделать это автоматически?

(или я должен все закрепить локально, затем запросить удаленный, а если это не удастся, то запросить локально)

1 Ответ

0 голосов
/ 09 ноября 2019

Отличный вопрос.

В Parse есть концепция кэшированных запросов. https://docs.parseplatform.org/ios/guide/#caching-queries

Интересной особенностью кэшированных запросов является то, что вы можете указать - «если нет сети». Однако это работает, только если вы ранее кэшировали результаты запроса. Я также обнаружил, что задержка между потерей подключения к сети и кэшированным запросом, признающим, что его потерянная сеть делает всю возможность немного мусорной.

Как я решил эту проблему, используя комбинацию библиотеки AlamoFire изакрепление объектов. Причина, по которой я решил использовать библиотеку AlamoFire, заключается в том, что она очень хорошо поддерживается и почти сразу же обнаруживает пропадание сетевого подключения. У меня всего несколько сотен записей, так что я не беспокоюсь о закреплении объектов, и определенно производительность не влияет. Итак, как я работаю, это ....

Определите некоторые объекты класса в верхней части класса

// Network management
private var reachability: NetworkReachabilityManager!
private var hasInternet: Bool = false

Вызовите метод при пробуждении представления

// View lifecycle
override func awakeFromNib() {
        super.awakeFromNib()
        self.monitorReachability()
    }

Обновление объекта при изменении доступности сети. Я знаю, что этот метод можно улучшить.

private func monitorReachability() {
        NetworkReachabilityManager.default?.startListening { status in
            if "\(status)" == "notReachable" {
                self.hasInternet = false
            } else {
                self.hasInternet = true
            }
            print("hasInternet = \(self.hasInternet)")
        }
    }

Затем, когда я вызываю запрос, у меня появляется переключатель при настройке объекта запроса.

// Start setup of query
let query = PFQuery(className: "mySecretClass")

if self.hasInternet == false {
    query.fromLocalDatastore()
    }
// Complete rest of query configuration

Конечно, я прикрепляю всерезультаты, которые я когда-либо возвращал с сервера.

...