【问题标题】:UIApplicationWillEnterForegroundNotification get called more and moreUIApplication WillEnterForegroundNotification 被越来越多地调用
【发布时间】:2012-02-13 14:00:07
【问题描述】:

我在视图控制器中使用此功能来识别应用是否再次处于活动状态并刷新一些数据:

[[NSNotificationCenter defaultCenter]
            addObserver:self
               selector:@selector(becomeActive:)
                   name:UIApplicationWillEnterForegroundNotification
                 object:nil];

这适用于激活后刷新,但每次应用从后台返回到前台(非活动到活动)时,它都会再次调用该函数。

所以如果我关闭并打开应用程序 4 次,该函数将被调用 4 次!

EDIT:函数会这样调用:

  1. 关闭和打开:函数调用了 1 次(这就是我想要的方式)
  2. 关闭和打开:函数调用了 2 次​​li>
  3. 关闭和打开:函数调用了 3 次
  4. 关闭和打开:函数调用了 4 次

但它只需要在回到前台后调用 1 次。在某些情况下,应用程序必须在激活并检查数据后显示警报视图。当函数被调用 4 次时,此警报视图将显示 4 次。

在应用程序委托中,这个函数什么都不做,但它被提及了。

我正在使用 Xcode 4.2 和 iOS 5!我也用了UIApplicationDidBecomeActive,但是也出现了同样的问题。

【问题讨论】:

  • 问题是你不断添加更多的观察者,每个实例在事件发生时都会引发调用。一种或另一种方式,找出在任何时候只启用一个观察者实例。

标签: iphone xcode nsnotificationcenter


【解决方案1】:

我不知道您何时将 self 添加为观察者,但每次应用程序激活时,您似乎一次又一次地将 self 添加为观察者。因此多次调用。

您只能将视图控制器添加为观察者一次。尝试使用控制器 init: 方法。并且,确保在 dealloc: 方法中删除视图控制器作为观察者。

【讨论】:

  • 我不同意你的建议。如果您希望其他对象了解该事件,注册UIApplicationWillEnterForegroundNotification 是完全可以的。事实上,它可以做出更好的设计。不过,我同意您对问题原因的假设。原始发布者必须确保仅将视图控制器添加一次到通知中心,而不是每次应用程序进入前台或进入后台时。
  • 我真的很喜欢这种使用 NSNotifactionCenter 的方式,因为我可以更新我想要更新的视图控制器。我不是你的意思,将它添加到通知中心一次。什么是放置在 nsnotification 中心的最佳位置。实际上它在视图控制器中,这可能是问题吗?我应该把它放到自己的功能中吗?也许是一种只会被称为一次的东西?你对我有什么建议吗?
  • 我明白了,使用这种方法很好,我做了错误的假设。您必须确保只调用 [[NSNotificationCenter defaultCenter] addObserver:...] 一次。因此,也许将此调用放在您的控制器 viewDidLoad: 方法中,并确保 100% 在控制器被销毁时从 defaultCentre 中删除控制器(通过使用 [[NSNotificationCenter defaultCenter] removeObserver:...]。您目前在哪里调用 [[NSNotificationCenter defaultCenter] addObserver:...]?
  • 再想一想,viewDidLoad: 方法可能会在应用程序变为活动状态时再次调用(对此不确定)。在这种情况下,您必须在 viewDidUnload 方法(以及 dealloc)中将对象作为观察者移除。您应该使用 init: 方法将对象添加为观察者。
  • 起初,viewdidload 在激活后不会自动调用,这就是我使用 NSNotificationCenter 的原因!这称为 viewdidload。我认为 viewdidunload 只有在应用程序完全完成时才会被调用,而不是在它处于非活动状态时调用! removeObserver 的想法似乎是个好主意,但我应该把它放在哪里.. 也许当我添加一个新的观察者时,我可以删除旧的..
【解决方案2】:

这实际上就是这个通知应该做的。如果您需要在应用程序启动时收到通知,请使用 applicationDidFinishLaunching。

【讨论】:

  • 如果应用程序再次激活(或回到前台),则不会调用此方法。
【解决方案3】:

我认为您应该在 viewWillDisappear 方法中删除 addObserver。它对我有用。

- (void)viewWillDisappear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

【讨论】:

    【解决方案4】:

    不,我解决了我的问题。

    通过观察者调用的方法将不再调用viewDidLoad。所以viewDidLoad 只会调用一次(在第一次应用程序启动时)。

    将通过观察者调用的函数getActive现在调用最初从viewDidLoad中调用的方法。

    我还将removeObserver 函数放到viewDidLoad 中,只有在用户完全停止应用程序时才会调用它。

    感谢您的想法和帮助!现在我对制作多任务应用程序有了一些了解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2017-01-15
      • 2017-08-03
      • 2017-06-02
      • 2013-07-19
      相关资源
      最近更新 更多