Firebase — приложение долгое время не отвечает (из-за синхронизации данных?)

#ios #swift #firebase #firebase-realtime-database

#iOS #swift #firebase #firebase-база данных в реальном времени

Вопрос:

Я работаю над приложением, подобным RunKeeper.

Эта проблема возникает, когда приложение захватило много данных о местоположении, и все данные были сохранены локально из-за отсутствия подключения к Интернету.

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

     showProcessingIcon()

    userRef.observeSingleEvent(of: .value, with: { snapshot in
        //.... process and display data....

        hideProcessingIcon()    
    }) { (error) in
        //.... handle error....

        hideProcessingIcon()            
    }
  

Иногда значок обработки исчезает примерно через минуту. Иногда мне приходилось выходить из приложения после ожидания в течение 5 минут или около того, при этом значок обработки все еще вращался. Иногда я замечал, что приложение выгружалось, пока я ждал завершения обработки (телефон автоматически блокируется через 1 минуту).

Есть идеи, как этого избежать?

Спасибо.

Ответ №1:

На самом деле вы не можете предотвратить синхронизацию данных, пока Firebase SDK подключен к Сети. Если у вас большая ожидающая запись, для завершения потребуется столько времени, сколько необходимо, и другие записи будут блокироваться до завершения.

Вместо этого вы можете собирать данные в какое-либо другое хранилище (локальный файл или базу данных) вместо прямой записи в базу данных с помощью SDK. Затем вы можете выбрать, когда эти данные, наконец, будут записаны в базу данных реального времени (но для завершения все равно потребуется столько же времени).

Комментарии:

1. «он будет блокировать другие записи до завершения», Будет ли он также блокировать операции чтения? Это то, что я пытаюсь сделать в моем случае — считывание данных, никаких записей.

2. Все запросы передаются по конвейеру через один websocket. Если этот веб-сокет занят каким-либо чтением / записью, то всем остальным придется подождать его завершения.