Ответ 1
Это на самом деле довольно просто. Когда вы присоединяете наблюдателя (используя observeEventType
или observeSingleEventOfType
), Firebase будет:
- Немедленно поднять события с любыми полными кэшированными данными.
- Запросить обновленные данные с сервера и, когда они появятся, поднять новые события, если данные отличаются от того, что было кэшировано.
Есть несколько тонкостей, которые выпадают из этого, хотя:
- Мы собираем события с кэшированными данными только в том случае, если они завершены. Это означает:
- Если у нас нет кэшированных данных (вы не наблюдали это местоположение раньше), мы не будем создавать события с нулевым или похожим. Вы не получите никаких событий, пока не получите данные с сервера.
- Если у вас есть частичные данные для этого местоположения (например, вы наблюдали /foo/bar ранее, но теперь вы наблюдаете /foo ), вы получите
ChildAdded
события для полных детей (например,/foo/bar), но вы не получит событиеValue
(например, для /foo ), пока мы не получим полные данные с сервера для местоположения, которое вы наблюдаете.
- Если вы используете
observeSingleEventOfType
, вы явно запрашиваете только одно событие, и если у вас есть кешированные данные, будет # 1, но # 2 не будет, что может и не быть тем, что вы хотите ( никогда не увидим последние данные сервера).
Надеюсь, это поможет!