我仍然掌握了IOS代表团的责任,所以我希望这个问题在解释我想要做的事情时有意义......
我想要做的是在我的应用首次运行后立即在后台线程上下载一些JSON数据。然后将解析数据,然后更新全局变量。一旦发生这种情况,我希望所有先前推送的视图控制器根据已下载和解析的数据更新其内容。
我提出的解决此问题的方法是让我的app委托或我的自定义Navigation Controller子类成为将解析数据的自定义JSON对象的委托。委托将运行一个协议方法,在解析完成后更新全局变量。
现在,一旦设置了此变量,任何被推送到导航堆栈的视图控制器都可以使用它。我还想更新之前推送过的视图控制器,以便更新其内容。
我知道我可以让顶视图控制器成为运行协议的活动委托但是之前推送的视图控制器呢?这是否可能,或者是否有其他方法可以使之前推送的视图控制器更新其内容?
答案 0 :(得分: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;
}
此外,当您不再需要通知时,您应该取消注册为观察员(例如在dealloc
中)
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}