通知所有加载的ViewControllers的某个事件

我有一段时间在后台同步数据。 用户可以在应用程序的导航树中的任何位置,无论用户在哪里,我都需要能够使用我刚刚同步的任何新数据来更新视图控制器。

我把负责后台线程同步的对象作为SharedAppDelegate的一个属性。

在某种程度上,我需要实现类似Observer模式的东西,每次我实例化视图控制器时,都会设置它来侦听后台同步对象上的某个事件,这样每次同步后我都可以在正在侦听的视图控制器中执行一个方法。

我不确定在Objective-C中做到这一点的正确方法是什么,或者是否有更好的或推荐的方法。

使用NSNotificationNSNotificationCenter ,这正好符合您的目的:

  • 在你的AppDelegate中,当同步结束时,调用

     [[NSNotificationCenter defaultCenter] postNotificationName:@"SyncEnded" object:mySyncObject] 
  • 在你显示的每个视图控制器中,调用

     _myObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"SyncEnded" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note){ ...your UI refresh code... } 
  • 当不再需要的时候也不要忘记删除观察者(视图控制器已经释放/卸载/不可见,直到你),否则NSNotificationCenter将会崩溃:

     [[NSNotificationCenter defaultCenter] removeObserver:_myObserver]; 

一些注意事项:

本示例使用基于块的API在主操作队列上执行UI刷新工作(隐含在主线程中),因为您不能在主线程之外的任何其他线程上执行UIKit操作。 这很可能是因为您的后台同步会在其他线程上发送通知,因此需要切换到主线程。 如果您想使用基于select器的API,请确保在主线程上发送通知。

您可以根据需要在通知上注册许多观察者,因此,这完全符合您的模式( NSNotifications通常是通知应用程序范围事件(如同步结束)的不同应用程序组件的最佳方式)。

发布通知时传递的object参数允许您在需要的情况下使用note.object访问观察器块中的同步对象。