Slabý vzorec událostí a klasické události v MVVMCrossu (nebo jakémkoli rámci .NET) slouží různým účelům a mají odlišné implementace, zaměřené především na řízení úniku paměti a životnost objektů.
Klasické události
Klasické události v .NET jsou založeny na silných odkazech. Když se objekt přihlásí k události jiného objektu, ze zdroje události je vytvořen silný odkaz na předplatitele. To znamená, že pokud zdroj události má odkaz na předplatitele, nemůže být předplatitel shromažďován odpadky, i když již není v aplikaci potřeba ani odkazován jinde. To může vést k úniku paměti, pokud předplatitel není výslovně odhlášen z události, když již není potřeba.
V MVVMCrossu lze klasické události použít pro komunikaci mezi ViewModels a pohledy, ale vyžadují pečlivé řízení, aby se zabránilo únikům paměti. Například, pokud ViewModel vystaví událost a pohled se předplatí, bude ViewModel mít silný odkaz na pohled, což zabrání jeho shromáždění odpadků, dokud nebude předplatné výslovně odstraněno.
Slabý vzorec událostí
Slabý vzorec událostí je navržen tak, aby zabránil únikům paměti pomocí slabých referencí místo silných. Když předplatitel použije slabý vzorec událostí k odběru události, zdroj události má slabý odkaz na předplatitele. To umožňuje, aby předplatitel byl shromažďován odpadky, pokud se již v aplikaci již není odkazován, i když se z události výslovně nepopisoval.
V MVVMCrossu může použití slabých událostí pomoci udržovat čistou architekturu tím, že zajistí, že ViewModels nedrží silné odkazy na názory. To je zvláště důležité v mobilních aplikacích, kde je správa paměti kritické. MVVMCross poskytuje rozšíření jako `slabssubscribe` pro usnadnění používání slabých událostí, což umožňuje vývojářům přihlásit se k událostem bez vytvoření silných odkazů, které by mohly vést k úniku paměti.
Implementace a výhody
Implementace slabých událostí obvykle zahrnuje vytvoření vlastního mechanismu pro správu předplatných pomocí objektů `slabéreference`. Tento přístup zajišťuje, že předplatitelé mohou být shromažďováni odpadky, pokud již nejsou potřeba, což snižuje riziko úniku paměti. Zavádí však také další složitost a mírnou režii výkonu kvůli potřebě zkontrolovat, zda jsou předplatitelé stále naživu, než zavolají na obsluhy událostí.
Nevýhody a úvahy
Zatímco slabý vzorec událostí je prospěšný pro prevenci úniku paměti, má některé nevýhody. Implementace může být složitější než klasické události a existuje riziko objektů předplatitelů „zombie“, které se již nepoužívají, ale dosud nebyly shromážděny odpadky. Pokud je událost zvýšena a je provedena obsluha zombie předplatitele, může to vést k neočekávanému chování nebo chybám.
Stručně řečeno, slabý vzorec událostí v MVVMCrossu se liší od klasických událostí pomocí slabých odkazů, aby se zabránilo únikům paměti a umožnilo snadnějšímu shromažďování odpadků. I když nabízí významné výhody, pokud jde o správu paměti, vyžaduje pečlivé implementaci a zvážení potenciálních nevýhod.
Citace:[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capturing-the-onexit-event-in-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/the-weak-event-pattern-is-nangerous/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-Handbook/using-mvvmcross-to-create-your-xamarin-app/navigation/Responding-the-events-from-different-controls-in-the-listview
[8] https://www.devleader.ca/2024/02/14/Weak-events-in--how-to-avoid-Nasty-Memory-Úteany
[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/wh-to-use-weak-events