Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Kako se vzorec šibkega dogodka razlikuje od klasičnih dogodkov v MVVMcross


Kako se vzorec šibkega dogodka razlikuje od klasičnih dogodkov v MVVMcross


Šibki vzorec dogodkov in klasični dogodki v MVVMcross (ali kateri koli .NET Framework) služijo različnim namenom in imajo različne izvedbe, namenjene predvsem za upravljanje puščanja spomina in življenjske dobe predmetov.

Klasični dogodki

Klasični dogodki v .NET temeljijo na močnih referencah. Ko se predmet naroči na dogodek drugega predmeta, se ustvari močna referenca iz vira dogodka do naročnika. To pomeni, da dokler se vir dogodka sklicuje na naročnika, naročnika ni mogoče zbrati smeti, tudi če ga v aplikaciji ni več potrebno ali sklicevanje na drugod. To lahko privede do uhajanja pomnilnika, če naročnik ni izrecno odjavljen iz dogodka, ko ga ni več potrebno.

V MVVMcrossu se lahko klasične dogodke uporabljajo za komunikacijo med ViewModeli in pogledi, vendar potrebujejo skrbno upravljanje, da se izognejo puščanju spomina. Če na primer ViewModel izpostavi dogodek in se nanj naroči, se bo ViewModel močno skliceval na pogled in preprečil, da bi se smeti zbral, dokler naročnina ne bo izrecno odstranjena.

Vzorec šibkega dogodka

Šibki vzorec dogodkov je zasnovan tako, da prepreči puščanje spomina z uporabo šibkih referenc namesto močnih. Ko naročnik uporablja šibek vzorec dogodka, da se naroči na dogodek, se vir dogodka šibeje sklicuje na naročnika. To omogoča, da se naročnik zbira smeti, če ga v aplikaciji ne omenjajo več drugje, tudi če iz dogodka ni izrecno odjavljen.

V MVVMcrossu lahko uporaba šibkih dogodkov pomaga ohraniti čisto arhitekturo z zagotavljanjem, da ViewModele ne bodo močni sklicevanja na poglede. To je še posebej pomembno pri mobilnih aplikacijah, kjer je upravljanje pomnilnika kritično. MVVMcross ponuja razširitve, kot je `šibkosbscribe`, da olajšajo uporabo šibkih dogodkov, kar razvijalcem omogoča, da se naročijo na dogodke, ne da bi ustvarili močne reference, ki bi lahko privedle do uhajanja spomina.

Izvajanje in ugodnosti

Izvajanje šibkih dogodkov običajno vključuje ustvarjanje mehanizma po meri za upravljanje naročnin s pomočjo predmetov `šibkoreference". Ta pristop zagotavlja, da se naročniki lahko zbirajo smeti, če jih ne potrebujejo več, kar zmanjšuje tveganje za puščanje spomina. Vendar pa uvaja tudi dodatno zapletenost in rahlo zmogljivost nad glavo zaradi potrebe po preverjanju, ali so naročniki še živi, ​​preden pokličejo svoje upravljavce dogodkov.

Pomanjkljivosti in pomisleki

Medtem ko je šibek vzorec dogodkov koristen za preprečevanje puščanja spomina, ima nekaj pomanjkljivosti. Izvajati je lahko bolj zapleteno kot klasični dogodki in obstaja tveganje za predmete "zombi", ki niso več v uporabi, vendar še niso bili zbrani smeti. Če se dogodek dvigne in se izvaja naročnik zombija, lahko privede do nepričakovanega vedenja ali napak.

Če povzamemo, se šibek vzorec dogodkov v MVVMcross razlikuje od klasičnih dogodkov z uporabo šibkih referenc, da se prepreči puščanje pomnilnika in omogoča, da se naročniki lažje zbirajo smeti. Čeprav ponuja velike koristi v smislu upravljanja pomnilnika, zahteva natančno izvajanje in upoštevanje morebitnih pomanjkljivosti.

Navedbe:
[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-first-xamarin-app/navion/naving-the-the-events-from-different-Controls-in-list
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-avoid-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-to-use-weak-events