Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Cum diferă modelul de eveniment slab de evenimentele clasice din MVVMcross


Cum diferă modelul de eveniment slab de evenimentele clasice din MVVMcross


Modelul de evenimente slab și evenimentele clasice din MVVMcross (sau orice cadru .NET) servesc scopuri diferite și au implementări distincte, care vizează în principal gestionarea scurgerilor de memorie și a duratei de viață a obiectelor.

Evenimente clasice

Evenimentele clasice din .NET se bazează pe referințe puternice. Când un obiect se abonează la un eveniment al unui alt obiect, se creează o referință puternică de la sursa evenimentului către abonat. Aceasta înseamnă că, atâta timp cât sursa evenimentului deține o referire la abonat, abonatul nu poate fi colectat de gunoi, chiar dacă nu mai este necesar sau se face referire în altă parte a cererii. Acest lucru poate duce la scurgeri de memorie dacă abonatul nu este dezabonat în mod explicit de la eveniment atunci când nu mai este necesar.

În MVVMcross, evenimentele clasice pot fi utilizate pentru comunicarea între ViewModels și Views, dar necesită un gestionare atentă pentru a evita scurgerile de memorie. De exemplu, dacă un ViewModel expune un eveniment și o vizualizare se abonează la acesta, ViewModel va ține o referire puternică la vedere, împiedicându -l să fie colectat gunoiul până la eliminarea în mod explicit a abonamentului.

Model de eveniment slab

Modelul de eveniment slab este conceput pentru a preveni scurgerile de memorie folosind referințe slabe în loc de cele puternice. Când un abonat folosește un model de eveniment slab pentru a se abona la un eveniment, sursa evenimentului deține o referință slabă la abonat. Acest lucru permite abonatului să fie colectat de gunoi dacă nu mai este trimis în altă parte a cererii, chiar dacă nu s -a dezabonat în mod explicit de la eveniment.

În MVVMcross, utilizarea evenimentelor slabe poate ajuta la menținerea unei arhitecturi curate, asigurându -se că ViewModels nu păstrează referințe puternice la vizualizări. Acest lucru este deosebit de important în aplicațiile mobile în care gestionarea memoriei este esențială. MVVMCross oferă extensii precum „SlabSubscribe” pentru a facilita utilizarea evenimentelor slabe, permițând dezvoltatorilor să se aboneze la evenimente fără a crea referințe puternice care ar putea duce la scurgeri de memorie.

Implementarea și beneficiile

Implementarea evenimentelor slabe implică de obicei crearea unui mecanism personalizat pentru gestionarea abonamentelor folosind obiecte „slabeReference”. Această abordare asigură că abonații pot fi colectați de gunoi dacă nu mai sunt necesare, reducând riscul de scurgeri de memorie. Cu toate acestea, introduce, de asemenea, o complexitate suplimentară și o ușoară performanță aeriană din cauza necesității de a verifica dacă abonații sunt încă în viață înainte de a apela manipulatorii de evenimente.

Dezavantajele și considerațiile

În timp ce modelul de eveniment slab este benefic pentru prevenirea scurgerilor de memorie, acesta are unele dezavantaje. Poate fi mai complex de implementat decât evenimente clasice și există riscul de obiecte „zombie” care nu mai sunt utilizate, dar nu au fost încă colectate de gunoi. Dacă un eveniment este ridicat și este executat un gestionar al unui abonat zombie, acesta poate duce la un comportament sau erori neașteptate.

În rezumat, modelul de eveniment slab din MVVMcross diferă de evenimentele clasice prin utilizarea referințelor slabe pentru a preveni scurgerile de memorie și pentru a permite abonaților să fie colectați mai ușor gunoiul. Deși oferă beneficii semnificative în ceea ce privește gestionarea memoriei, necesită o implementare atentă și luarea în considerare a potențialelor dezavantaje.

Citări:
[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capting-the-onexit-event-in-wpf-with-mvmcross/31784453
[3] https://www.reaptiveui.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/resping-the-events-from-different-controls-in-the-listview
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-avoid-nasty-memory-sheaks
[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