在哪里删除 Xamarin iOS 中的通知观察者?

Posted

技术标签:

【中文标题】在哪里删除 Xamarin iOS 中的通知观察者?【英文标题】:Where to remove Notification observer in Xamarin iOS? 【发布时间】:2018-06-20 13:00:50 【问题描述】:

我正在 Xamarin 项目的 ViewDidLoad() 中注册通知。但是我看不到任何可以“删除”观察者的方法。即使视图不可见,我也需要执行某些操作,所以我不能在 ViewWillAppear 中给出它。有没有类似于“deinit”方法的东西。

在 C# 中尝试了“dispose”方法,但没有被调用。

即使在执行“PopViewController”之后,观察者仍然没有被取消注册。不知道为什么即使删除了视图控制器,它也没有从内存中释放出来。

【问题讨论】:

我认为 de initializer 是最好的地方 @SPatel Xamarin ios 的反初始化器的 C# 等效项是什么? 【参考方案1】:

根据您的需要,您可以覆盖 ViewWillAppear 和/或 ViewDidDisappear 以在此处添加/删除它。

public override void ViewWillAppear(bool animated)

    base.ViewWillAppear(animated);
    // subscribe


public override void ViewDidDisappear(bool animated)

    base.ViewDidDisappear(animated);
    // unsubscribe

请记住,ViewDidDisappear 将在新控制器被推到当前控制器顶部时调用,ViewWillAppear 将在新控制器弹出时再次调用,这可能不适合您尝试的任何操作去做。

【讨论】:

正是这不适合我想要实现的目标。就我而言,无论视图何时可见,我都必须执行一些操作。这就是我在 ViewDidLoad 中注册它的原因。 当控制器不再在堆栈上时,您想在什么时候移除观察者?您还可以覆盖 Dispose 并在那里或在您的控制器的终结器中执行此操作。 是的,当控制器不在导航堆栈上时。尝试在 C# 中使用“dispose”方法,但没有成功。知道如何使用该方法吗? Here's 是如何使用它的一个很好的例子。值得一提的是,即使在您弹出控制器之后,它仍然可以在垃圾收集器处理它之前在内存中停留一段时间。 尝试了以下链接中给出的解决方案(覆盖 Object.Finalize 的派生类的处置模式)。当我弹出视图控制器时,什么都没有被调用。我已经放置了控制台日志来验证相同的内容。不确定我是否在这里做错了什么。 docs.microsoft.com/en-us/dotnet/standard/garbage-collection/…【参考方案2】:

您可以在 ViewDidLoad 中对事件进行所有订阅,并且取消订阅它们会从 IO 自动发生。如果您真的想取消订阅,请在 Dispose 方法中进行。

这是一个例子,

ViewController中,

// Subscribing
public override void ViewDidLoad()

    _homeView.HomeButton.TouchUpInside += OnHomeButtonClicked;


// Unsubscribing
protected override void Dispose(bool disposing)

    _secondView.SecondButton.TouchUpInside -= OnSecondButtonClicked;
    base.Dispose(disposing);

【讨论】:

ViewDidUnload 自 iOS 6 起已被弃用 是的,即便如此,ViewDidUnload 只有在设备内存不足并需要释放一些内存时才会被调用 在@Nick 发表评论后,我做了一些广泛的研究,发现在 IOs 6+ 中,这种方法永远不会被用于在低内存下处理视图的方式。而且也没有必要在 viewController 中取消订阅监听器。如果确实需要完成,那么应该在 DidReceiveMemoryWarning 覆盖的方法中完成。我已经相应地更新了答案! DidReceiveMemoryWarning 也不适合这样做,尤其是在较新的硬件上,可用内存量可能永远不会变得足够低,无法调用该方法。 我看到 Dispose 是取消订阅听众的地方。最重要的是,取消订阅并不是必须的,IO 会自动处理它?

以上是关于在哪里删除 Xamarin iOS 中的通知观察者?的主要内容,如果未能解决你的问题,请参考以下文章

标签栏(视图控制器)中多次调用ios的通知中心方法方法?如何删除观察者?

使用 Azure 中的集线器注册推送通知时,Xamarin.iOS 本机崩溃错误 SIGSEGV

Xamarin.iOS 无法在推送通知中显示照片

Xamarin iOS 中的可操作推送通知

如何在 Xamarin Forms iOS 中的特定页面上导航?

在 Xamarin iOS 中的远程通知的“默认用户操作”上推送视图控制器