Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin MvvmCross ViewModel是否在iOS视图中终止。处置方法是否正常?_Xamarin_Xamarin.ios_Mvvmcross_Idisposable - Fatal编程技术网

Xamarin MvvmCross ViewModel是否在iOS视图中终止。处置方法是否正常?

Xamarin MvvmCross ViewModel是否在iOS视图中终止。处置方法是否正常?,xamarin,xamarin.ios,mvvmcross,idisposable,Xamarin,Xamarin.ios,Mvvmcross,Idisposable,我一直在读Stuart Logde关于如何在视图消失时杀死ViewModel的文章 我有一个复杂的ViewPresenter,有时候我会用UINavigationController模式显示一个ViewController,然后允许在其中导航。导航到另一个ViewController并按“完成”后,我将关闭整个UINavigationController及其所有ViewController。除了最上面的视图之外,不会在其他视图上调用ViewWillEnglishe,因为它们已经消失了,因此我需

我一直在读Stuart Logde关于如何在视图消失时杀死ViewModel的文章

我有一个复杂的ViewPresenter,有时候我会用UINavigationController模式显示一个ViewController,然后允许在其中导航。导航到另一个ViewController并按“完成”后,我将关闭整个UINavigationController及其所有ViewController。除了最上面的视图之外,不会在其他视图上调用ViewWillEnglishe,因为它们已经消失了,因此我需要另一种机制

在iOS上的MvxViewController中采用以下方法是否错误

private bool viewModelKilled;

protected override void Dispose (bool disposing)
{
    if (!viewModelKilled)
    {
        var killableViewModel = ViewModel as IKillableViewModel;
        if (killableViewModel != null)
        {
            killableViewModel.KillMe();
        }

        viewModelKilled = true;
    }

    base.Dispose (disposing);
}

这更像是iOS中的正常“解除锁定”方法,在这种方法中,用户通常会取消注册以观察其他对象。

在自定义演示器中,覆盖

public override void Show(MvxViewModelRequest request)
通过调用堆栈中已存在的祖先上的ShowViewModel,可以放弃完整导航控制器。因此,始终调用此Show方法,并将弹出现有的viewcontroller层次结构。您还可以在ShowViewModel中使用“提示”,该提示在
请求中传递

它确实知道pop前后现有的viewcontroller层次结构。所以它知道每一个被丢弃的vc。你必须在每个弹出的vc上调用Dispose(Xamarin可能会在几分钟后为你做这件事。除非你有对viewmodel或其他服务的硬引用。它太长了,我的经验表明它会填满你的内存)

在viewcontroller上调用Dispose足以触发ViewModel上的自动Dispose。如果您不想等待,还可以在viewmodel上调用Dispose,因为了解viewcontroller很容易获取viewmodel(属性:viewmodel!)


希望有帮助。

如果您使用ViewPresenter来显示视图,为什么不使用它来处理它们呢?我的印象是,在Xamarin中,您不需要在视图上手动调用Dispose,而是让垃圾收集器来执行此操作。不管视图中的Dispose方法实际上是如何调用的,我的问题更多的是关于是否可以从Dispose方法调用ViewModel,并告诉ViewModel从EventHandler等注销,以便让ViewModel也被释放。