0

我仍然了解 IOS 代表团,所以我希望这个问题在我解释我想要做的事情时有意义......

我想要做的是在我的应用程序首次运行后立即在后台线程上下载一些 JSON 数据。然后将解析数据,然后更新全局变量。一旦发生这种情况,我希望所有以前推送的视图控制器根据已下载和解析的数据更新其内容。

我提出的解决此问题的方法是让我的应用程序委托或我的自定义导航控制器子类成为将解析数据的自定义 JSON 对象的委托。一旦解析完成,委托将运行一个更新全局变量的协议方法。

现在,一旦设置了这个变量,任何被推送到导航堆栈的视图控制器都可以使用它。我还想更新之前推送的视图控制器,以便更新它们的内容。

我知道我可以使顶视图控制器成为一个活动委托,它将运行一个协议,但是之前推送的视图控制器呢?这甚至可能还是有另一种方法可以使先前推送的视图控制器更新其内容?

4

1 回答 1

1

在这种情况下,您并不想使用委托。您希望多个对象监听特定事件,因此请NSNotificationCenter改用。

当您的解析器完成解析 JSON 时,请执行以下操作:

[[NSNotificationCenter defaultCenter] postNotificationName: @"FinishedDataParsing" object:self userInfo:nil;

这样你也不需要全局变量。您可以在解析器对象中使解析的数据可访问,也可以使用 userInfo 字典将一些信息传递给通知接收器。

当你的解析完成时,你想在任何地方做某事,你首先必须注册为观察者(你可以在 中做到这一点viewDidLoad):

 [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(dataParsed:) 
    name:@"FinishedDataParsing"
    object:nil];

显然你必须实现你的回调方法来对你解析的数据做任何你想做的事情。

- (void)dataParsed:(NSNotification *)notification {
      // Do this to access the user info.
      NSDictionary *userInfo = notification.userInfo;

      // Or access your data parser object.
      DataParser *parser = (DataParser *)notification.object;
}

此外,当您不再需要收到通知时(例如 in dealloc) ,您应该取消注册为观察者

- (void) dealloc
{
   [[NSNotificationCenter defaultCenter] removeObserver:self];
   [super dealloc];
}
于 2013-08-06T20:45:36.593 回答