Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Kuo silpnas įvykių modelis skiriasi nuo klasikinių įvykių mvvmcross


Kuo silpnas įvykių modelis skiriasi nuo klasikinių įvykių mvvmcross


Silpnas įvykių modelis ir klasikiniai įvykiai MVVMCROSS (arba bet kuriame .NET sistemoje) tarnauja skirtingiems tikslams ir turi skirtingus įgyvendinimus, visų pirma, siekiant valdyti atminties nuotėkius ir objekto gyvenimo laikotarpius.

klasikiniai įvykiai

Klasikiniai įvykiai .NET yra pagrįsti stipriomis nuorodomis. Kai objektas užsiprenumeruoja kito objekto įvykį, nuo įvykio šaltinio iki abonento sukuriama stipri nuoroda. Tai reiškia, kad tol, kol įvykio šaltinis turi nuorodą į abonentą, abonentas negali būti surinktas šiukšlėmis, net jei jo nebereikia ar nurodoma kitur paraiškoje. Tai gali sukelti atminties nutekėjimą, jei abonentas nėra aiškiai aprašytas iš įvykio, kai jo nebereikia.

„MVVMCross“ klasikiniai įvykiai gali būti naudojami ryšiui tarp „ViewModels“ ir „Views“, tačiau jiems reikia kruopštaus valdymo, kad būtų išvengta atminties nutekėjimo. Pvz., Jei „ViewModel“ parodo įvykį ir jo užsiprenumeruoja vaizdas, „ViewModel“ turės tvirtą nuorodą į vaizdą, neleis jam surinkti šiukšlių, kol prenumerata nebus aiškiai pašalinta.

Silpnas įvykių modelis

Silpnas įvykių modelis yra skirtas užkirsti kelią atminties nutekėjimui, naudojant silpnas nuorodas, o ne stiprias. Kai abonentas naudoja silpną įvykių modelį, kad galėtų užsiprenumeruoti įvykį, įvykio šaltinis turi silpną nuorodą į abonentą. Tai leidžia abonentui surinkti šiukšles, jei jis nebebus nurodomas kitur paraiškoje, net jei jis nebuvo aiškiai aprašytas iš renginio.

„MVVMCross“ naudodamiesi silpnais įvykiais gali padėti išlaikyti švarią architektūrą užtikrinant, kad „ViewModels“ neturėtų tvirtų nuorodų į vaizdus. Tai ypač svarbu mobiliesiems programoms, kai atminties valdymas yra kritinis. „MVVMCross“ teikia plėtinius, tokius kaip „WearSubscribe“, kad būtų lengviau naudoti silpnus įvykius, leidžiant kūrėjams užsiprenumeruoti įvykius, nesukuriant stiprių nuorodų, kurios galėtų sukelti atminties nutekėjimą.

įgyvendinimas ir nauda

Silpnų įvykių įgyvendinimas paprastai apima pasirinktinį mechanizmo, skirto prenumeratų valdymui, sukūrimas naudojant „silpnosios tinklalapio“ objektus. Šis požiūris užtikrina, kad abonentai gali būti surinkti šiukšles, jei jų nebereikia, sumažindami atminties nuotėkio riziką. Tačiau tai taip pat pristato papildomą sudėtingumą ir nedidelę našumą, nes reikia patikrinti, ar abonentai vis dar gyvi prieš skambindami į savo renginių tvarkytojus.

trūkumai ir svarstymai

Nors silpnas įvykių modelis yra naudingas siekiant užkirsti kelią atminties nutekėjimui, jis turi keletą trūkumų. Įdiegti gali būti sudėtingiau nei klasikinius įvykius, ir yra „zombių“ abonentų objektų, kurie nebenaudojami, bet dar nebuvo surinkti šiukšlių, rizika. Jei iškeltas įvykis ir įvykdomas „Zombie“ abonento prižiūrėtojas, jis gali sukelti netikėtą elgesį ar klaidas.

Apibendrinant galima pasakyti, kad silpnas MVVMCROSS įvykių modelis skiriasi nuo klasikinių įvykių, naudojant silpnas nuorodas, kad būtų išvengta atminties nutekėjimo, ir leisti abonentams lengviau surinkti šiukšles. Nors tai suteikia didelę naudą atminties valdymo atžvilgiu, reikia atidžiai įgyvendinti ir apsvarstyti galimus trūkumus.

Citatos:
[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-dangerous/
[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/navigation/reageting-the-events-from-from-diferent-controls-in-listview
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-avoid-dasty-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