通知所有加载的ViewControllers的某个事件
我有一段时间在后台同步数据。 用户可以在应用程序的导航树中的任何位置,无论用户在哪里,我都需要能够使用我刚刚同步的任何新数据来更新视图控制器。
我把负责后台线程同步的对象作为SharedAppDelegate的一个属性。
在某种程度上,我需要实现类似Observer模式的东西,每次我实例化视图控制器时,都会设置它来侦听后台同步对象上的某个事件,这样每次同步后我都可以在正在侦听的视图控制器中执行一个方法。
我不确定在Objective-C中做到这一点的正确方法是什么,或者是否有更好的或推荐的方法。
使用NSNotification
与NSNotificationCenter
,这正好符合您的目的:
-
在你的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
访问观察器块中的同步对象。