Подтвердить что ты не робот

ViewModel LifeCycle, когда он удаляется?

В mvvmcross v3 ViewModel

public class TimerViewModel : MvxViewModel
{
    System.Timers.Timer timer;

    public TimerViewModel()
    {
        timer = new System.Timers.Timer(500f);

        timer.Elapsed += HandleTimerElapsed;

        timer.Start();

    }

    void HandleTimerElapsed (object sender, ElapsedEventArgs e)
    {
        Debug.Log( "Time Elapsed" );
    }
}

Поскольку MvxViewModel не реализует IDisposable, куда я должен поместить следующий код?

timer.Stop();
timer.Elapsed += HandleTimerElapsed;

Я обнаружил, что код mvvmcross имеет некоторую MvxWeakEventSubscription, используется ли она для решения моей проблемы?

4b9b3361

Ответ 1

Нет простого универсального способа узнать, когда dispose ViewModel - особенно после того, как вы начнете смешивать и сопоставлять стили презентации ViewModel, включая навигацию, вкладки, разделенные изображения, всплывающие окна, фрагменты, списки и т.д., и поскольку вы включаете больше и больше платформ

В результате этого несколько способов, с которыми я закрывал такие вещи, как таймеры в прошлом:

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

Например, я сделал несколько запусков/остановок "уровня страницы" с помощью:

  • OnPause/OnResume в Android
  • OnNavigatedTo/OnNavigatingFrom в Windows
  • ViewDidAppear/ViewWillDisappear в iOS

Я подумал о том, чтобы добавить это как обобщенный шаблон для этого (он зарегистрирован в https://github.com/slodge/MvvmCross/issues/74) - но пока я ' вы не добавили это в v3, поскольку я думаю, что это приведет к слишком большому недоразумению среди пользователей - лучше позволить им сделать это в тех немногих ситуациях, где это необходимо.

Обновление: я написал об этом в блоге и опубликовал образец - см. http://slodge.blogspot.co.uk/2013/11/n42-is-my-viewmodel-visible-can-i-kill.html

2. Иногда я просто использовал агрегирование событий через MvvmCross Messenger, и я использовал его встроенный обмен сообщениями WeakReference, чтобы убедиться, что ViewModel может быть собран в мусор, когда представление закончил с ним.

Пример этого в примере InternetMinute - который имеет единую услугу генерации тикета, которую ViewModels могут подключаться посредством обмена сообщениями для обновлений - см.:

Возможно, вы считаете, что это немного неэффективно, так как сообщения Tick будут генерироваться, даже если ViewModel отсутствует, но это лишь небольшая неэффективность.

3. Я рассмотрел возможность использования более финальных событий - таких, как OnNavigatingFrom(BACK) и 'onDestroy', и некоторые "окончательные" обнаружения в делегатах UINavigationController... но у меня не было причина сделать это "по-настоящему" в любом проекте.