Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Czym słaby wzór zdarzeń różni się od klasycznych wydarzeń w MVVMCROSS


Czym słaby wzór zdarzeń różni się od klasycznych wydarzeń w MVVMCROSS


Słaby wzorzec zdarzeń i klasyczne zdarzenia w MVVMCROSS (lub dowolnym frameworku .NET) służą różnym celom i mają odrębne implementacje, głównie mające na celu zarządzanie wyciekami pamięci i czasami żywotności obiektów.

klasyczne wydarzenia

Klasyczne wydarzenia w .NET oparte są na silnych odniesieniach. Gdy obiekt subskrybuje zdarzenie innego obiektu, ze źródła zdarzenia tworzone jest silne odniesienie do subskrybenta. Oznacza to, że tak długo, jak źródło zdarzenia zawiera odniesienie do abonenta, subskrybenta nie może być zbierany, nawet jeśli nie jest już potrzebny lub odwołany w innym miejscu aplikacji. Może to prowadzić do wycieków pamięci, jeśli subskrybent nie jest wyraźnie zrezygnowany z zdarzenia, gdy nie jest już potrzebny.

W MVVMCROSS klasyczne zdarzenia mogą być używane do komunikacji między ViewModels i widokami, ale wymagają one starannego zarządzania, aby uniknąć wycieków pamięci. Na przykład, jeśli ViewModel ujawni zdarzenie, a widok subskrybuje go, ViewModel będzie miała silne odniesienie do widoku, uniemożliwiając jego pobranie śmieci do momentu wyraźnego usunięcia subskrypcji.

słaby wzór zdarzeń

Słaby wzorzec zdarzeń został zaprojektowany w celu zapobiegania wyciekom pamięci przy użyciu słabych odniesień zamiast silnych. Gdy subskrybent używa słabego wzorca zdarzenia, aby zasubskrybować zdarzenie, źródło zdarzenia ma słabe odniesienie do abonenta. Umożliwia to zbieranie śmieci subskrybenta, jeśli nie jest już odwoływany w innych częściach aplikacji, nawet jeśli nie został wyraźnie analizowany z wydarzenia.

W MVVMCROSS stosowanie słabych zdarzeń może pomóc utrzymać czystą architekturę, zapewniając, że ViewModels nie mają silnych odniesień do widoków. Jest to szczególnie ważne w aplikacjach mobilnych, w których zarządzanie pamięcią ma kluczowe znaczenie. MVVMCROSS zapewnia rozszerzenia, takie jak `` SubsubScribe ', aby ułatwić stosowanie słabych zdarzeń, umożliwiając programistom zasubskrybowanie zdarzeń bez tworzenia silnych odniesień, które mogą prowadzić do wycieków pamięci.

wdrożenie i korzyści

Wdrażanie słabych zdarzeń zwykle obejmuje tworzenie niestandardowego mechanizmu do zarządzania subskrypcjami przy użyciu obiektów `` słabeReference '. Takie podejście zapewnia, że ​​subskrybenci mogą być zebrani śmieci, jeśli nie są już potrzebne, zmniejszając ryzyko wycieków pamięci. Wprowadza jednak również dodatkową złożoność i niewielką wydajność, ze względu na potrzebę sprawdzenia, czy subskrybenci nadal żyją, zanim zadzwonili do obsługi wydarzeń.

wady i rozważania

Chociaż słaby wzorzec zdarzeń jest korzystny dla zapobiegania wyciekom pamięci, ma pewne wady. Wdrożenie niż klasyczne zdarzenia może być bardziej złożone, a obiekty subskrybentów „zombie” nie są już używane, ale nie zostały jeszcze zebrane. Jeśli zdarzenie zostanie podniesione i wykonywana jest obsługa subskrybenta zombie, może prowadzić do nieoczekiwanego zachowania lub błędów.

Podsumowując, słaby wzorzec zdarzeń w MVVMCROSS różni się od klasycznych zdarzeń przy użyciu słabych odniesień, aby zapobiec wyciekom pamięci i umożliwienie łatwiej zbierać śmieci. Chociaż oferuje znaczące korzyści w zakresie zarządzania pamięcią, wymaga starannego wdrożenia i rozważania potencjalnych wad.

Cytaty:
[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capring-the-onexit-event-wpf-with-mvvmcross/31784453
[3] https://www.reactiveui.net/vs/mvvmcross
[4] https://mustafacanyucel.com/blog/blog-22.html
[5] https://ladimolnar.com/2015/09/14/thedeak-event-pattern-is-dangous/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcross fandbook/using-mvvmcross-to-create-liurst-xamarin-app/navigation/respreding-the-events-from-different-controls-in-the-listview
[8] https://www.devleader.ca/2024/02/14/weak-events-in-chow-to-avoid-lasty-memory-taks
[9] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/events/weak-event-patterns?view=netdesktop-9.0
[10] https://www.mvvmcross.com/documentation/fundamentals/navigation
[11] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[12] https://stackoverflow.com/questions/13788787/when-to-use-feak-events