2013-10-29 2 views
5

MvvmCross 응용 프로그램에서 Messenger Plugin을 사용하고 있으며 때로는 구독을 삭제하는 경우가 있습니다 ("하나 이상의 수신기가 실패했습니다 - 예약이 제거되었습니다"). 이것은 내 응용 프로그램에 오류를 일으키는 것입니다. 기본적으로 구독에 약한 참조를 사용하고 있으며 메시지 수신을 취소하지 않았습니다.MvvmCross Messenger Plugin 구독 삭제

탈퇴해야합니까? 가비지 수집을 허용하는 약한 참조의 요점이 아닌가요?

내 BaseView는 아래와 같이 생성자에 가입합니다.

public BaseView() 
    { 
     _messenger = Mvx.Resolve<IMvxMessenger>(); 
     _messenger.Subscribe<MyMessage>(s => Method()); 
    } 

내 브로드 캐스트 수신기가 내 메시지를 게시하고 있습니다.

var _messenger = Mvx.Resolve<IMvxMessenger>(); 
_messenger.Publish<MyMessage>(new MyMessage(this)); 

나는 onDestroy에서 탈퇴하려는 생각이 있습니다.

이 문제가 발생하는 이유와 해결 가능한 해결책에 대해 알려 주시면 감사하겠습니다.

미리 감사드립니다.

+0

이 질문은 몇 가지 코드의 혜택이 아닌 것 - 위키

이에 대한 자세한 내용은 섹션을 참조하십시오 "수집 된 쓰레기는 가입 토큰이 구독에서 반환 할 때마다이 GC 기반 탈퇴가 발생할 것이다" "내 BaseView가 생성자에서 구독 중이며 onDestroy에서 구독을 취소하려고합니다." – Stuart

+0

몇 가지 코드를 추가했습니다. 더 자세한 정보가 필요하면 알려주세요. – Jake

답변

13

약한 참조를 사용하는 경우 반환 된 구독 토큰을 클래스 수준 필드에 저장하는 것이 중요합니다.

private IDisposable _token; 

public BaseView() 
{ 
    _messenger = Mvx.Resolve<IMvxMessenger>(); 
    _token = _messenger.Subscribe<MyMessage>(OnMyMessage); 
} 

private void OnMyMessage(MyMessage msg) 
{ 
    // code 
} 

이렇게하지 않으면 GarbageCollector가 무료로 구독을 수집 할 수 있습니다. https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#messenger