2012-05-23 131 views
1

我试图找出在我的应用程序中实现MVC设计的最佳方法。现在,当用户进入UITableViewController时,我会向我的模型发送请求以访问Internet并下载一些数据。当数据返回时,我希望它能够更新数据,即使我的UITableViewController被交易(由用户关闭视图或退出视图)。所以目前我更新了模型,然后在模型上有一个委托来在UITableViewController上“更新UI”。基本上在数据返回之后,我希望模型调用[tableView reloadData],并使用委托实现此功能。NSURLConnection MVC最佳实践

我的问题:

  1. 这是一定正确的方法是什么?有没有其他方法可以让我的模型在我的UIViewController上调用方法?

  2. 如果我希望在模型更改时通知多个ViewController,例如,如果退出UITableViewController1然后导航到UITableViewController2并使用相同的模型/数据,该怎么办?我应该在模型上创建多个代表吗?

只是寻找一些最佳实践,并想知道我是否正确地做到了这一点。

在此先感谢。

回答

1

您可以使用NSNotification来提醒收听者的更改,或Key-Value Observing(KVO)。两者都是Observer Pattern的风格,这将帮助您从模型中删除耦合到视图,并作为奖励允许任意数量的观察者查找有关模型的更改,而无需单独告知所有模型。

有自动和手动更改通知。 This explains the difference

我敢打赌,你会做手工通知,所以你会做:

[self willChangeValueForKey:@"something"]; 
... // update 'something' here 
[self didChangeValueForKey:@"something"]; 

而且观察员将得到通知。自动方法需要使用您可能不会在内部使用的属性方法。通常KVO适用于模型的单个属性,当然模型中可能有许多发送通知。如果你正在按照“我刚刚完成过程X”的方式做更多的事情,那可能更多的是NSNotification。

+0

对于KVO,在解析来自Web请求的XML数据并更改模型后,它会自动通知注册更改通知的VC?那时如果模型是一个对象数组,我可以调用tableView:insertRows:atIndexPaths? – VTS12

+0

Yikes ...格式在评论中效果不好。我更新了响应以添加有关手动/自动KVO的一些信息。 –

0

回答问题2 - 如果你有一些对象,应该通知一些事件,你应该使用NSNotifications(观察者模式)。这可以帮助您轻松地使这些对象发生反应,更新他们的视图等。

+0

我读过使用NSNotifications可以使应用程序非常难以管理。我们有很多HTTP请求进出​​多个模型。这是一个好主意还是应该由多个代表完成?这甚至有可能吗? – VTS12

+0

你可以看到[这里](http://stackoverflow.com/questions/1927965/nsnotificationcenter-vs-delegation-using-protocols)他们之间的差异。据我所知,所有用通知编写的代码都可以由代表重写。在你的情况下,我认为通知比代理更容易做到 – medvedNick