У меня есть приложение, которое будет работать на нескольких устройствах одновременно. Некоторые могут в какой-то момент перейти в автономный режим и отправят данные, когда вернутся в оперативный режим. Однако способ, которым я настроил свой объект, не является оптимальным, что означает, что существует много избыточных данных и проблем со скоростью.
Приложение очень специфично для определенной отрасли, поэтому я не могу вставить настоящий код. Я использовал два класса, 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 секунд или около того.
Мне не нравится этот способ, потому что, похоже, у него есть много проблем.
Если есть кто-то знающий, который может помочь, я был бы очень признателен!