UIViewController可见回调函数

3
我正在开发一款iOS应用程序,需要在有网络连接时完成某些任务,在没有网络连接时完成其他任务。如果在某个时刻我没有网络连接,我将向用户显示一条消息,要求其给予我网络并返回。问题是如何检测以下情况:
  • 用户按两次Home键,进入多任务处理,然后进入设置并连接到网络
  • 用户从多任务处理返回我的应用程序,但没有按任何按钮

我知道我会收到AppDelegate的回调:

- (void)applicationDidEnterBackground:(UIApplication *)application
- (void) applicationDidBecomeActive:(UIApplication *)application

但是这段代码(不是我编写的)非常庞大,我不想在那里处理UIViewController的需求,是否有其他的替代方案。
当用户返回时,我的UIViewController的- (void)viewDidAppear:(BOOL)animated没有被调用。
断点肯定没有被命中!
除了在AppDelegate中,还有其他可用的想法吗?
2个回答

7
您可以使用通知中心在视图控制器中监听applicationDidEnterBackground事件:
[[NSNotificationCenter defaultCenter] addObserver: self
                                      selector: @selector(handleEnteredBackground:) 
                                      name: UIApplicationDidEnterBackgroundNotification
                                      object: nil];

viewDidLoad中执行此操作。同样,在applicationDidBecomeActive中执行。在viewDidUnload中不要忘记将自己作为观察者移除。

+1 可能会被接受,尽管在视图控制器中有很多通知,但我真的不想触碰 AppdDlegate。 - user529543
它完美地工作,正如我所需。对我来说值得10个赞,非常感谢。 - user529543
1
你必须在 dealloc 方法中移除自己作为观察者。没有任何保证 viewDidUnload 方法会被调用。你 可以 在两个方法中都这样做。 - NJones

2
应用程序代表是处理应用程序状态变化的正确位置,但仅仅因为这样,并不意味着您必须将由应用程序状态变化触发的所有逻辑都放在那里。请将逻辑放在它所属的位置。如果是网络代码,则不在应用程序代表或视图控制器中,而应该放在一个单独的类中。然后查看将应用程序的不同部分连接在一起的方法。在大多数情况下,通知、KVO和共享实例模式是不错的选择。

加1分鼓励,但并没有帮助。我已经说过代码非常庞大,很难在这里移动任何东西,存在许多内存泄漏等问题。重写需要超过6个月的时间,我不想再为每次更改调试1周。 - user529543

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接