2013-07-25 1 views
3

В MvvmCross ViewModel метод Init используется для любой инициализации экрана. Однако экран не нарисован до тех пор, пока Init не будет полностью завершен. У меня есть некоторые тяжелые операции (поиск db). Поэтому в идеале я хотел бы нарисовать экран с индикатором выполнения, а затем запустить мои методы инициализации и, наконец, обновить экран. Где я могу поместить эти операции в MvvmCross ViewModel?Где положить тяжелые операции init в MvvmCross

ответ

4

Я бы сделал тяжелый материал в Service. В этой службе я бы либо:

  • сделать метод, который вызывает в Done событие, которое вы можете прослушивать в вашем ViewModel и оттуда заселить Свойства с данными.

или

  • Сделать метод асинхронной который вы ждете на фоне потока, и когда она возвращает вас заселить Свойства.

Хотя эта служба запускает и извлекает данные, я бы просто отображал что-то еще на экране, пока данные загружаются. Это могут быть некоторые кэшированные данные или индикатор выполнения или что-то еще.

+1

+1 - хотя иногда вам нужно быть осторожным с выполненным событием, так как это может привести к утечкам, если вы никогда не откажетесь от подписки - в этих случаях лучше использовать подписку на сообщения, используя слабые ссылки. – Stuart

+0

Но что заставляет сервис начать его работу? Если я инициирую его из init, не имею ли я такую ​​же проблему (поскольку это не async)? –

+3

У вас не будет этой проблемы, если вы используете фоновый поток ... – Cheesebaron