【问题标题】:Unsubscribe Xamarin Messaging Center iOS取消订阅 Xamarin 消息中心 iOS
【发布时间】:2016-10-25 00:13:03
【问题描述】:

我正在使用 Xamarin 的消息中心从照片实用程序类发回一个通知,当响应返回一张照片已成功上传到服务器时。

视图模型

public constructor
{

    var photoUtility = new PhotoUtility();
    MessagingCenter.Subscribe<Helper_PhotoUtility, string>(this, "UploadedNotifier", (sender, value) =>
                {
                //do some updates to the photo's status
                }


}

PhotoUtility

Private UploadFinished()
{
    MessagingCenter.Send<Helper_PhotoUtility, string>(this, "UploadedNotifier", PhotosGUIDPK);
}

在 Android 中一切都很好,因为在 OnAppearing / OnDisappearing 后面附加 XAML 的代码只被调用了一次。然而,在 iOS 中,每次 UI 让位于相机时都会调用这些事件。这会导致在拍照期间取消订阅消息中心的小问题。

我读到您可以将所有内容移至构造函数并首先调用取消订阅,但这似乎很hacky。

有没有人知道在视图模型正常生命周期内可靠地订阅/取消订阅消息中心的方法,而不依赖于非 Xamarin 支持的框架?

【问题讨论】:

    标签: xamarin xamarin.ios


    【解决方案1】:

    我通常从构造函数(或从构造函数调用的方法)进行设置。如果您觉得这很 hacky,那么一个简单的替代方法是使用 bool 作为哨兵来检查您是否已经设置了订阅。

    bool subscribed = false;
    
    protected override void OnAppearing() {
    
      if (!subscribed) {
        // setup messaging
        subscribed = true;
      }
    }
    

    【讨论】:

    • 如果我的哨兵出现在我什么时候退订?当相机在 iOS 的前台时,在 OnDisappearing 中取消订阅仍然会让我没有订阅者。如果我根本不取消订阅,如果他们离开并返回此视图模型,我最终可能会收到多个订阅。除非我错误地认为 Messaging Center 订阅超出了类订阅的范围。
    • 我一般不担心退订,也没有遇到任何问题。我不能肯定这种方法没有缺点,但我还没有看到它们。
    • 猜猜我必须测试一下。如果订阅者没有将类保存在内存中的引用,那么这解决了我的问题。我仍然不喜欢取消订阅可能已订阅或未订阅的事件的想法,但这是一个答案。
    • @Jason 如果你不取消订阅,每次创建对象都会增加调用次数。
    【解决方案2】:

    上面的例子很有帮助,但是我在多次启动页面后仍然遇到了超额订阅的情况,因为我没有在任何地方取消订阅。如果我实现了上面的示例代码,每次我在导航堆栈上推送我的页面时,我都会在 MessageCenter 中额外订阅相同的签名。 在下面的代码中,每次我从视图模型推送页面或模式时,我都会设置 AdditionalPageOrModalToNav = true。

              private readonly NavigationPage _navPage = Application.Current.MainPage as NavigationPage;
        private bool _viewModelSubscribed;
        protected override void OnAppearing()
        {
            if (!_viewModelSubscribed)
            {
                ViewModel.SubscribeMessages();
                _viewModelSubscribed = true;
                _navPage.PoppedToRoot += NavPage_PoppedToRoot;
            }
            base.OnAppearing();
        }
    
        protected override void OnDisappearing()
        {
            if (ViewModel.AddedPageOrModalToNav)
            {
                ViewModel.AddedPageOrModalToNav = false;
            }
            else
            {
                if (!ViewModel.AddedPageOrModalToNav)
                {
                   _navPage.PoppedToRoot -= NavPage_PoppedToRoot;
                    ViewModel.UnsubscribeMessages();
                    _viewModelSubscribed = false;
                }
            }
    
            base.OnDisappearing();
        }
    
        void NavPage_PoppedToRoot(object sender, NavigationEventArgs e)
        {
            _navPage.PoppedToRoot -= NavPage_PoppedToRoot;
            ViewModel.UnsubscribeMessages();
            _viewModelSubscribed = false;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-15
      • 2018-03-25
      • 2012-01-26
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多