В MvvmCross ViewModel метод Init используется для любой инициализации экрана. Однако экран не нарисован до тех пор, пока Init не будет полностью завершен. У меня есть некоторые тяжелые операции (поиск db). Поэтому в идеале я хотел бы нарисовать экран с индикатором выполнения, а затем запустить мои методы инициализации и, наконец, обновить экран. Где я могу поместить эти операции в MvvmCross ViewModel?Где положить тяжелые операции init в MvvmCross
3
A
ответ
4
Я бы сделал тяжелый материал в Service
. В этой службе я бы либо:
- сделать метод, который вызывает в
Done
событие, которое вы можете прослушивать в вашемViewModel
и оттуда заселить Свойства с данными.
или
- Сделать метод асинхронной который вы ждете на фоне потока, и когда она возвращает вас заселить Свойства.
Хотя эта служба запускает и извлекает данные, я бы просто отображал что-то еще на экране, пока данные загружаются. Это могут быть некоторые кэшированные данные или индикатор выполнения или что-то еще.
+1 - хотя иногда вам нужно быть осторожным с выполненным событием, так как это может привести к утечкам, если вы никогда не откажетесь от подписки - в этих случаях лучше использовать подписку на сообщения, используя слабые ссылки. – Stuart
Но что заставляет сервис начать его работу? Если я инициирую его из init, не имею ли я такую же проблему (поскольку это не async)? –
У вас не будет этой проблемы, если вы используете фоновый поток ... – Cheesebaron