Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Чем слабый шаблон событий отличается от классических событий в MVVMcross


Чем слабый шаблон событий отличается от классических событий в MVVMcross


Слабые шаблоны событий и классические события в MVVMcross (или любой .NET Framework) служат различным целям и имеют различные реализации, в первую очередь, направленные на управление утечками памяти и временем жизни объекта.

Классические события

Классические события в .net основаны на сильных ссылках. Когда объект подписывается на событие другого объекта, из источника события создается сильная ссылка на подписчик. Это означает, что до тех пор, пока источник события содержит ссылку на подписчика, абонент не может быть собран мусором, даже если он больше не нужен или не упоминается в других местах приложения. Это может привести к утечкам памяти, если подписчик явно не выписывается от события, когда это больше не нужно.

В MVVMcross классические события могут использоваться для общения между ViewModels и Views, но они требуют тщательного управления, чтобы избежать утечек памяти. Например, если ViewModel раскрывает событие и подписание представления, ViewModel будет иметь прочную ссылку на представление, предотвращая его собирать мусор, пока подписка не будет явно удалена.

Слабый шаблон событий

Слабый шаблон событий предназначен для предотвращения утечек памяти с помощью слабых ссылок вместо сильных. Когда подписчик использует слабую шаблон событий для подписки на событие, источник события имеет слабую ссылку на подписчика. Это позволяет подписчику собираться мусор, если его больше не упоминаются в другом месте в приложении, даже если он явно не выписывается от события.

В MVVMcross использование слабых событий может помочь поддерживать чистую архитектуру, гарантируя, что ViewModels не придерживались сильных ссылок на представления. Это особенно важно в мобильных приложениях, где управление памятью имеет решающее значение. MVVMcross предоставляет расширения, такие как «SleedSubscribe», чтобы облегчить использование слабых событий, позволяя разработчикам подписаться на события без создания сильных ссылок, которые могут привести к утечкам памяти.

Реализация и преимущества

Реализация слабых событий обычно включает в себя создание пользовательского механизма для управления подписками с использованием объектов `sleedReference». Этот подход гарантирует, что подписчики могут быть собраны мусором, если они больше не нужны, снижая риск утечек памяти. Тем не менее, это также вводит дополнительную сложность и небольшую накладную расходы из -за необходимости проверить, живы ли абоненты, прежде чем вызовать их обработчики событий.

Недостатки и соображения

Хотя слабый шаблон событий полезен для предотвращения утечек памяти, у него есть некоторые недостатки. Это может быть более сложным для реализации, чем классические события, и существует риск того, что объекты подписчиков «зомби», которые больше не используются, но еще не собирались мусор. Если событие поднимается и выполняется обработчик абонента зомби, оно может привести к неожиданному поведению или ошибкам.

Таким образом, слабый шаблон событий в MVVMcross отличается от классических событий, используя слабые ссылки для предотвращения утечек памяти и позволяют подписчикам быть более легко собирать мусор. Несмотря на то, что он предлагает значительные преимущества с точки зрения управления памятью, он требует тщательной реализации и рассмотрения потенциальных недостатков.

Цитаты:
[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-dangous/
[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/responsing-the-events-from-different-controls-in-the-the-the-listview
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-avoid-nasty-memory-утечки
[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