2013-06-05 1 views
1

Этот вопрос является продолжением/«второй попыткой» для моего previous question.Где и как я могу подписаться на мессенджерские события внутри ViewModel?

Я создаю кросс-платформенное мобильное приложение с использованием рамки MvvmCross, , и я хотел бы использовать плагин Messenger для получения уведомлений о событиях, опубликованных где-то еще в моем коде.

Я пытался добавить подписку в ctor следующим образом:

public class MyViewModel : BaseViewModel, IMyViewModel 
{ 
    private MvxSubscriptionToken _showMsgToken; 

    public MyViewModel() 
    { 
     _showMsgToken = MvxMessenger.Subscribe<ShowMsg>(message => onShowNavigation(), MvxReference.Weak); 
    } 
    private void onShowNavigation() 
    { 
     //Do Stuff 
    } 
} 

Теперь, когда я перейти к этому ViewModel все работает и уведомления принимаются.
Однако, когда я перемещаюсь и возвращаюсь к этой ViewModel, я вижу, что подписка добавляет еще одну запись в свойство подписки MvxMessenger, в результате чего onShowAdsNavigation() срабатывает дважды для каждого нового события.

Итак, как я могу подписаться на события в ViewModel? Или, может быть, мне нужно найти способ отказаться от подписки на события?

ответ

1

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

Для некоторых вариантов на этом см ViewModel LifeCycle, when does it get disposed?


Я вообще не заморачиваться с активным управлением подписками. Вместо этого я полагаюсь на то, что View будет удален из пользовательского интерфейса, и поэтому он и его ViewModel будут удалены из памяти через некоторое время после этого. Когда это произойдет, я знаю, что управление подпиской произойдет автоматически - когда View и ViewModel получат Garbage Collected, то вскоре подписки будут очищены. Я знаю, что слабая ссылка, используемая в Messenger, будет означать, что подписки будут очищены.

Чтобы это доказать, попробуйте https://github.com/slodge/MessengerHacking - у него есть кнопка, чтобы заставить GC произойти.

Если это не «достаточно хорошо * для вашего приложения, то смотрите„Если вам нужно активно ...“выше.

+0

Хорошо, спасибо @Stuart – Liel