2

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

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

在某种程度上,我需要实现类似于观察者模式的东西,并且每次实例化视图控制器时都将其设置为侦听后台同步对象上的某些事件,以便在每次同步后我可以在正在侦听的视图控制器中执行一个方法。

我不确定在 Objective-C 中执行此操作的正确方法是什么,或者是否有更好或推荐的方法。

4

1 回答 1

2

使用NSNotificationwith 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 操作。这可能是您的后台同步将在其他线程上发送通知,因此切换到主线程是必要的。如果您想使用基于选择器的 API,请务必在主线程上发送通知。

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

发布通知时传递的object参数允许您在需要时访问观察者块中的同步对象note.object

于 2012-08-09T08:54:58.390 回答