Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Hogyan különbözik a gyenge eseménymintázat a klasszikus eseményektől az mvvmcross -ban


Hogyan különbözik a gyenge eseménymintázat a klasszikus eseményektől az mvvmcross -ban


A gyenge eseménymintázat és a klasszikus események az MVVMCross -ban (vagy bármely .NET keretrendszerben) különböző célokat szolgálnak, és különálló megvalósításokkal rendelkeznek, elsősorban a memória szivárgásainak és az objektum élettartama kezelésére irányulnak.

klasszikus események

A .NET klasszikus eseményei erős referenciákon alapulnak. Amikor egy objektum feliratkozik egy másik objektum eseményére, az eseményforrástól az előfizetőig erős referencia jön létre. Ez azt jelenti, hogy mindaddig, amíg az eseményforrás hivatkozik az előfizetőre, az előfizető nem lehet gyűjteni, még akkor sem, ha már nincs szükség vagy hivatkozva az alkalmazás más részein. Ez memóriaszivárgáshoz vezethet, ha az előfizető nem kifejezetten feliratkozik az eseményről, amikor erre már nincs szükség.

Az MVVMCROSS -ban a klasszikus események felhasználhatók a ViewModels és a Views közötti kommunikációhoz, de a memória szivárgásainak elkerülése érdekében gondos kezelést igényelnek. Például, ha egy ViewModel kitett egy eseményt, és egy nézet feliratkozik rá, akkor a ViewModel határozottan utal a nézetre, megakadályozva, hogy a szemét összegyűjtötte, amíg az előfizetést kifejezetten eltávolítják.

gyenge eseménymintázat

A gyenge eseménymintát úgy tervezték, hogy megakadályozzák a memória szivárgását azáltal, hogy az erősek helyett gyenge referenciákat használnak. Amikor egy előfizető gyenge eseménymintát használ egy eseményre való feliratkozáshoz, az eseményforrás gyenge hivatkozással rendelkezik az előfizetőre. Ez lehetővé teszi, hogy az előfizető összegyűjtse az előfizető, ha már nem hivatkoznak az alkalmazás más részein, még akkor is, ha az nem írta fel kifejezetten az eseményről.

Az MVVMCross -ban a gyenge események használata elősegítheti a tiszta architektúra fenntartását azáltal, hogy biztosítja, hogy a ViewModels ne hivatkozzon erősen a nézetekre. Ez különösen fontos a mobil alkalmazásokban, ahol a memóriakezelés kritikus. Az MVVMCross olyan kiterjesztéseket biztosít, mint például a „gyenge szubscriface” a gyenge események használatának megkönnyítése érdekében, lehetővé téve a fejlesztők számára, hogy az eseményekre feliratkozzanak anélkül, hogy erős hivatkozásokat hoznának létre, amelyek memória szivárgásához vezethetnek.

megvalósítás és előnyök

A gyenge események bevezetése általában egyéni mechanizmus létrehozását foglalja magában az előfizetések kezelésére a „FesReference” objektumok segítségével. Ez a megközelítés biztosítja, hogy az előfizetők összegyűjtsék a szemetet, ha már nincs szükségük rá, csökkentve a memória szivárgásának kockázatát. Ugyanakkor további bonyolultságot és enyhe teljesítményt vezet be, mivel ellenőrizni kell, hogy az előfizetők még életben vannak -e, mielőtt felhívnák az eseménykezelőiket.

Hátrányok és megfontolások

Noha a gyenge eseménymintázat előnyös a memória szivárgásainak megelőzésére, van néhány hátránya. Bonyolultabb lehet a megvalósítás, mint a klasszikus események, és fennáll annak a veszélye, hogy a "zombi" előfizetők olyan tárgyak, amelyek már nem használnak, de még nem gyűjtöttek szemetet. Ha egy rendezvényt felvetik, és a zombi előfizető kezelőjét végrehajtják, ez váratlan viselkedéshez vagy hibához vezethet.

Összefoglalva: az MVVMCross gyenge eseménymintája különbözik a klasszikus eseményektől, ha gyenge referenciák felhasználásával megakadályozzák a memória szivárgásait, és lehetővé tegyék az előfizetők számára, hogy könnyebben összegyűjtsék a szemetet. Noha jelentős előnyöket kínál a memóriakezelés szempontjából, gondos végrehajtást és a lehetséges hátrányok megfontolását igényli.

Idézetek:
[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://mustafacanyel.com/blog/blog-22.html
[5] https://ladimolnar.com/2015/09/14/the-weak-event-pattern-is-dangerous/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-rease/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/using-mvvmcross-to-create-create-first-xamarin-app/navigation/resaplesing-the-events-ther-different-Controls-in-the-ListView
[8] https://www.devleader.ca/2024/02/14/weat-events-in-c-how-to-offoid-nasty-memory-leaks
[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-touse-weak-events