我正在开发一个基于 Apple 提供的 Master-View 模板的应用程序(它包含两个 ViewController,MasterViewController 和 DetailViewController)。我添加了一个模型来与我的服务器通信。
但是,当我的 Model 收到来自服务器的消息时,它需要调用 MasterViewController 或 DetailViewController 类中的方法。我怎样才能做到这一点?
非常感谢所有帮助。
我正在开发一个基于 Apple 提供的 Master-View 模板的应用程序(它包含两个 ViewController,MasterViewController 和 DetailViewController)。我添加了一个模型来与我的服务器通信。
但是,当我的 Model 收到来自服务器的消息时,它需要调用 MasterViewController 或 DetailViewController 类中的方法。我怎样才能做到这一点?
非常感谢所有帮助。
您可以从模型中触发通知,这些通知由 Master 和 Detail View 控制器处理。
在模型中:
- (void)receivedMessageFromServer {
// Fire the notification
[[NSNotificationCenter defaultCenter] postNotificationName:@"ReceivedData"
object:nil];
}
在视图控制器中处理“ReceivedData”通知:
- (void)viewDidLoad {
[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receivedDataNotification:)
name:@"ReceivedData"
object:nil];
}
- (void)receivedDataNotification:(id)object {
NSLog(@"Received Data!");
}
实际上,Apple 提出的 MVC 模式允许从模型到控制器的通知。
实现此目标的一个好方法是在您的数据更改时通过NSNotificationCenter传递NSNotification对象,并提供有关更改内容的信息,并让侦听器处理它。
您应该使用可选的协议委托方法。我有一个关于如何在此PO中设置委托方法的示例的答案。
块是要走的路。
您需要在 ViewController 中引用您的模型。当您想要更新数据时,您向模型发送一条消息并将块作为参数传递给它,当从服务器接收到响应时,它将被调用。
例如:
视图控制器
[self.model fetchDataFromRemoteWithCompletionHandler:^(id responseObject, NSError *error)
{
// responseObject is the Server Response
// error - Any Network error
}];
模型
-(void)fetchDataFromRemoteWithCompletionHandler:(void(^)(id, NSError*))onComplete
{
// Make Network Calls
// Process Response
// Return data back through block
onComplete(foobarResponse, error);
}