Плохая реализация модели Firebase, которая извлекает тонны данных: хотелось бы получить совет о лучшем способе сделать это - PullRequest
0 голосов
/ 06 марта 2019

У меня есть приложение, которое будет работать на нескольких устройствах одновременно. Некоторые могут в какой-то момент перейти в автономный режим и отправят данные, когда вернутся в оперативный режим. Однако способ, которым я настроил свой объект, не является оптимальным, что означает, что существует много избыточных данных и проблем со скоростью.

Приложение очень специфично для определенной отрасли, поэтому я не могу вставить настоящий код. Я использовал два класса, Foo и Baa, чтобы проиллюстрировать мою проблему.

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

class Foo() {
HashMap(String, Baa) BaaHashMap;
String fooName;
}

class Baa() {
String baaName;
Integer baaValue;
}

Инициализация объектов:

private Foo returnInitialisedFoo() {
private Foo foo = new Foo();
HashMap<String, Baa> baaHashMap = new Hashmap();

for (int i = 0 to 100) {
baaHashMap.put("Number" + String.ValueOf(i), new Baa);
}

foo.baaHashMap = baaHashMap;

return foo;
}

У меня установлен Firebase ValueEventListener на Foo. Когда пользователь обновляет любой из объектов Baa в HashMap, я помещаю только свойства в Baa, которые изменили на Firebase:

if (baaNameChanged) {
getInstance().child(path).setValue(baaNameProperty); }

if(baaValueChanged) {
getInstance().child(path).setValue(baaValueProperty); }

Будет две категории людей, которые будут использовать приложение одновременно. Одна категория будет обновлять только свойство baaName. Другая категория будет обновлять только свойство baaValue.

Причина, по которой я нажал свойства по одному, заключается в следующем сценарии онлайн / офлайн: -

Всем пользователям будет показано представление со списком объектов Baa (из списка, который содержит 100 значений, инициализированных выше в returnInitialisedFoo ()). Будет выбран объект Baa для обновления из списка.

Пользователь с устройством, подключенным к сети, пойдет и обновит целый ряд объектов Baa именем Baa. Данные будут синхронизированы с Firebase.

Однако есть также пользователь, который обновляет baaValues ​​с устройства, которое находится в автономном режиме. Если я нажму весь объект Baa, когда устройство перейдет в оперативный режим, пустые baaNames из его данных перезапишут данные первого парня.

Проблема с обновлением значений по отдельности заключается в следующем: У меня есть ValueEventListener от Firebase, который срабатывает, когда он видит какие-либо изменения в онлайн-объекте Foo (от любого из пользователей на любом из устройств). В реальном приложении эквивалент класса Baa имеет около 8 или 9 значений, которые будут обновляться индивидуально. Таким образом, слушатель события value извлекает объект Foo 8 или 9 раз, так как изменения обновляются в Firebase (есть один экран, на котором пользователь обновляет значения, а затем нажимает кнопку сохранения, чтобы передать все измененные свойства данным в Firebase).

Это тянет много данных. Это также означает, что существует значительная задержка обновления интерфейса для отображения новых значений (около 2 секунд для большого Foo).

Я, должно быть, упускаю что-то очевидное - я был бы очень признателен за совет по этому поводу. Я также посмотрел транзакции Firebase, чтобы узнать, смогу ли я сразу запустить полный Baa, но похоже, что я все равно столкнусь с ситуацией, когда данные перезаписываются.

В данный момент я думаю о том, чтобы сохранить локальную копию Foo на устройстве в памяти, которую я использую для заполнения интерфейса. Любые изменения, сделанные пользователем, будут одновременно обновляться в Foo в памяти и отправляться в Firebase.

Тогда я буду обновлять локальный Foo только изменениями из ValueEventListener каждые 5 секунд или около того.

Мне не нравится этот способ, потому что, похоже, у него есть много проблем.

Если есть кто-то знающий, который может помочь, я был бы очень признателен!

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