Некоторые вопросы о keepSynced (true) для ограниченной ссылки на запрос - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть приложение с поддержкой Firebase со следующей структурой базы данных:

posts
      /uid
           /postId

Первоначально я загружал данные с узла posts/uid, используя ObserveEventOfType с .childAdded. Это будет загружать устаревшие данные часто (~ 5 раз в день) для всех пользователей моего приложения одновременно. При попытке обновить данные, создав новую запись, Firebase все равно будет возвращать устаревшие данные.

В результате я решил попробовать keepSynced. Теперь, если бы моя ссылка выглядела так:

reference = Database().database.reference.child("posts").child(uid)

keepSynced загрузит все данные на этом узле, что может привести к очень большим загрузкам, если в этом узле много дочерних элементов. Поэтому я решил изменить ссылку / запрос на:

reference = Database().database.reference.child("posts").child(uid).queryLimited(toLast: 25)

При включении keepSynced для этого узла он успешно синхронизируется с последними 25 дочерними узлами. Тем не менее, я все еще сталкиваюсь с проблемой получения устаревших данных довольно часто. Итак, вот мои вопросы:

  1. При добавлении режима keepSynced для ограниченного запроса он только синхронизирует c с исходного узла, к которому вы добавили его, или всегда просто syn c 25 последних потомков этого узла?

  2. Где лучше всего добавить строку keepSynced(true) в коде? Перед тем, как загрузить ссылку, в viewWillAppear или внутри фактического обратного вызова загрузки?

  3. Точно так же, где лучше всего использовать keepSynced(false)?

  4. Удаляют ли слушатели keepSynced, когда приложение переходит в фоновый режим?

  5. Почему keepSynced иногда не обращается к дочерним обновлениям ?

В настоящее время я использую keepSynced(true) внутри функции, которую я использую для загрузки сообщений, которая вызывается на viewDidLoad.

Заранее спасибо.

1 Ответ

2 голосов
/ 04 апреля 2020

Поскольку его имя подразумевает keepSynced(true), все запросы или ссылки, которые вы вызываете, синхронизируются в локальном кэше. Он буквально просто прикрепляет пустой наблюдатель к этому запросу / ссылке. Таким образом, в вашем Database().database.reference.child("posts").child(uid).queryLimited(toLast: 25) он будет синхронизировать c последние 25 дочерних узлов и будет продолжать синхронизировать их (удаляя предыдущие по мере добавления новых).

Механизм кэширования базы данных Firebase Realtime работает наиболее надежно, если вы повторно слушать точно такие же данные. В частности, прослушиватель .value, подключенный к Database().database.reference.child("posts").child(uid), может не видеть данные, которые были кэшированы через Database().database.reference.child("posts").child(uid).queryLimited(toLast: 25). Это связано с тем, что клиент Firebase гарантирует, что никогда не будет запускать события для частичных обновлений, и в этом примере он не может гарантировать, что он имеет все данные из первой ссылки.

Для ваших вопросов:

  1. См. Выше ...

  2. Чаще всего их добавляют в viewWillAppear.

  3. Я не уверен, почему вы хотите позвонить keepSynced false, поэтому не могу ничего рекомендовать там.

  4. Не уверен, что это именно то, что вы имеете в виду, но keepSynced(true) не сохраняется между работает из приложения. Поэтому вы должны звонить keepSynced(true) каждый раз, когда запускается ваше приложение / представление.

  5. См. Выше ...

В общем, вы, кажется, попытайтесь обойти работу API, вызывая API различными способами. Я обычно не вижу хороших результатов от этого. Если вы хотите, чтобы ваше приложение работало не так, как API, рассмотрите возможность создания пользовательской оболочки и кэширования данных там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...