2

我正在开发一个基于 Apple 提供的 Master-View 模板的应用程序(它包含两个 ViewController,MasterViewController 和 DetailViewController)。我添加了一个模型来与我的服务器通信。

但是,当我的 Model 收到来自服务器的消息时,它需要调用 MasterViewController 或 DetailViewController 类中的方法。我怎样才能做到这一点?

非常感谢所有帮助。

4

4 回答 4

3

您可以从模型中触发通知,这些通知由 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!");
}
于 2012-05-27T17:21:03.773 回答
3

实际上,Apple 提出的 MVC 模式允许从模型到控制器的通知。

实现此目标的一个好方法是在您的数据更改时通过NSNotificationCenter传递NSNotification对象,并提供有关更改内容的信息,并让侦听器处理它。

于 2012-05-27T17:26:40.920 回答
2

您应该使用可选的协议委托方法。我有一个关于如何在此PO中设置委托方法的示例的答案。

于 2012-05-27T18:44:38.330 回答
1

块是要走的路。

您需要在 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);
}
于 2014-09-06T17:46:33.767 回答