2013-04-12 14 views
13

W mvvmcross v3 ViewModelViewModel LifeCycle, kiedy zostaje usunięty?

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"); 
    } 
} 

Jak MvxViewModel nie wdrożyć IDisposable, gdzie należy umieścić następujący kod?

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

Uważam, że kod mvvmcross jakieś MvxWeakEventSubscription, jest ona wykorzystywana do rozwiązania mojego problemu?

+0

Niestety - nie rozumiem Twojego scenariusza. Jeśli podasz znacznie więcej szczegółów, postaram się pomóc. Może dostarczyć pełny przykład Widok i ViewModel, który wymaga usunięcia – Stuart

+0

@Stuart, zaktualizowane pytanie –

Odpowiedz

10

Nie ma łatwego, uniwersalnego sposobu, aby wiedzieć, kiedy do dispose ViewModel - szczególnie po rozpoczęciu miksowania i dopasowywania stylów prezentacji ViewModel do nawigacji, tabulatorów, podzielników, wysuwanych, fragmentów, list itp., A wraz z nimi coraz więcej platformy

wskutek tego, kilka sposobów i zamknąwszy rzeczy jak liczniki dół w przeszłości są:

1. Czasami Użyłem specjalistyczny interfejs na ViewModel i zapewnienia tego jest wywoływany odpowiednio na każdym kliencie.

Na przykład, zrobiłem trochę załączania/wyłączania Strona "poziom Wyświetleń używając:

  • OnPause/OnResume w Androidzie
  • OnNavigatedTo/OnNavigatingFrom w Windows
  • ViewDidAppear/ViewWillDisappear w iOS

Myślałem o dodaniu tego jako uogólnionego wzorca do tego celu (jest on zalogowany https://github.com/slodge/MvvmCross/issues/74) - ale do tej pory nie dodałem tego do wersji v3, ponieważ atrament doprowadziłby do zbyt wielu nieporozumień wśród użytkowników - lepiej pozwolić im to zrobić w nielicznych sytuacjach, w których jest to potrzebne.

Aktualizacja: Mam blogu na ten temat i opublikował próbki - patrz http://slodge.blogspot.co.uk/2013/11/n42-is-my-viewmodel-visible-can-i-kill.html

2. Czasami mam tylko używane Event Aggregation przez MvvmCross Messenger - i użyłem to nieodłączne WeakReference - oparte na wiadomościach, aby upewnić się, że ViewModel może zostać zbuforowany po zakończeniu widoku.

Przykładem tego jest próbą InternetMinute - który ma jeden „usługę generacji Tick”, który ViewModels może łączyć się za pośrednictwem wiadomości o aktualizacjach - patrz:

można rozważyć ten nieznacznie nieefektywne - jak komunikaty Tick zostanie wygenerowany nawet jeśli ViewModel nie jest obecny - ale to tylko niewielka INEF ficiency.

3. ja uważane za pomocą więcej końcowe wydarzenia - takie rzeczy jak OnNavigatingFrom(BACK) i „onDestroy” i trochę „ostateczny” wykrywanie na delegatów UINavigationController ... ale ja nie miałem powodu, aby to zrobić „dla prawdziwe "na każdym projekcie jeszcze.

Powiązane problemy