Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Kā vājais notikumu modelis atšķiras no klasiskajiem notikumiem MVVMCROSS


Kā vājais notikumu modelis atšķiras no klasiskajiem notikumiem MVVMCROSS


Vājais notikumu modelis un klasiskie notikumi MVVMCROSS (vai jebkurā .NET ietvarā) kalpo dažādiem mērķiem, un tiem ir atšķirīga ieviešana, kas galvenokārt paredzēta atmiņas noplūdes un objekta dzīves ilguma pārvaldīšanai.

klasiskie notikumi

Klasiskie notikumi .NET ir balstīti uz spēcīgām atsaucēm. Kad objekts abonē cita objekta notikumu, no notikuma avota uz abonentu tiek izveidota spēcīga atsauce. Tas nozīmē, ka, kamēr notikumu avotam ir atsauce uz abonentu, abonentu nevar savākt atkritumus, pat ja tas vairs nav vajadzīgs vai atsaucas uz citur pieteikumā. Tas var izraisīt atmiņas noplūdes, ja abonents nav tieši abonēts no notikuma, kad tas vairs nav vajadzīgs.

MVVMCROSS klasiskos notikumus var izmantot komunikācijai starp ViewModels un skatiem, taču, lai izvairītos no atmiņas noplūdes, tiem nepieciešama rūpīga pārvaldība. Piemēram, ja ViewModel pakļauj notikumu un skats, kas to abonē, ViewModel saglabās spēcīgu atsauci uz skatu, neļaujot tai savākt atkritumus, līdz abonements nav skaidri noņemts.

Vāja notikumu modelis

Vājš notikumu modelis ir paredzēts, lai novērstu atmiņas noplūdes, izmantojot vājas atsauces, nevis spēcīgas. Kad abonents izmanto vāju notikumu modeli, lai abonētu notikumu, notikuma avotam ir vāja atsauce uz abonentu. Tas ļauj abonentu savākt atkritumus, ja uz to vairs nav atsauce citur lietojumprogrammā, pat ja tas nav tieši abonēts no notikuma.

MVVMCROSS vāju notikumu izmantošana var palīdzēt uzturēt tīru arhitektūru, nodrošinot, ka ViewModels nav spēcīgas atsauces uz viedokļiem. Tas ir īpaši svarīgi mobilajās lietojumprogrammās, kur atmiņas pārvaldība ir kritiska. MVVMCROSS nodrošina tādus paplašinājumus kā `vāji, lai atvieglotu vāju notikumu izmantošanu, ļaujot izstrādātājiem abonēt notikumus, neradot spēcīgas atsauces, kas varētu izraisīt atmiņas noplūdes.

ieviešana un priekšrocības

Vāju notikumu ieviešana parasti ietver pielāgota mehānisma izveidi abonēšanas pārvaldīšanai, izmantojot objektus `wearReference”. Šī pieeja nodrošina, ka abonentus var savākt atkritumus, ja tie vairs nav nepieciešami, samazinot atmiņas noplūdes risku. Tomēr tas arī ievieš papildu sarežģītību un nelielu veiktspēju pieskaitāmās izmaksas, jo ir jāpārbauda, ​​vai abonenti vēl ir dzīvi pirms viņu notikumu apstrādātājiem.

Trūkumi un apsvērumi

Kaut arī vājais notikumu modelis ir izdevīgs atmiņas noplūdes novēršanai, tam ir daži trūkumi. Īstenot var būt sarežģītāk nekā klasiski notikumi, un pastāv risks, ka "zombiju" abonentu objekti vairs netiek izmantoti, bet vēl nav savākti atkritumi. Ja tiek izvirzīts notikums un tiek izpildīts zombiju abonenta apstrādātājs, tas var izraisīt negaidītu izturēšanos vai kļūdas.

Rezumējot, vājais notikumu modelis MVVMCross no klasiskajiem notikumiem atšķiras, izmantojot vājas atsauces, lai novērstu atmiņas noplūdes un ļautu abonentiem savākt atkritumus. Lai gan tas piedāvā ievērojamas priekšrocības atmiņas pārvaldības ziņā, tas prasa rūpīgu iespējamo trūkumu ieviešanu un apsvēršanu.

Atsauces:
[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-rease/
.
[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