Mat*_*tyG 9 iphone model-view-controller object objective-c ios
我试图了解如何更好地实现模型 - 视图 - 控制器设计模式.
什么对象应该"拥有"Model对象?单个Controller是否应该实例化(拥有)Model对象?
以下是一个示例场景:
我有一个包含两个UIViewControllers(controllerA和controllerB)的UITabbarController.显然,这些控制器都不是彼此拥有的.我有一个Model对象,它包含一些数据并执行一些网络活动.controllerA和controllerB都需要能够对Model对象进行更改.controllerB需要知道何时对Model对象进行了更改(通过controllerA或从网络活动返回的结果).从最近的阅读:
主要是,两个控制器是否有任何其他方式来访问(写入)一个模型,而不是通过模型作为单例?
此外,当Controller拥有另一个Controller时(例如,当根视图控制器实例化另一个视图控制器以在其自身之上堆叠时,在UINavigationController中),共享模型的最佳方法是根视图控制器实例化模型,并且在将其推送到导航堆栈之前将其传递给下一个视图控制器)?
随着项目的扩展,在AppDelegate中存储全局对象会变得非常难看.
问问自己:这个模型对象和我的应用程序中的其他对象之间有什么关系?关系是1对1还是1对n.如果您只需要通过各种对象访问一个模型,那么请使用单例方法.如果您需要一个对象只有一个模型,那么在该对象中保留一个指向它的指针.
当面对不同但计算正确的设计备选方案时,需要考虑几个方面
如果您开始将全局模型滚动到AppDelegate中,您最终将创建一个难以理解且难以维护的单一类.如果在每个控制器中创建指向模型的指针,则必须在每次实例化新控件时传递对该模型的引用,并且必须将指针传递给它实例化的任何需要的对象.从本质上讲,你已经创建了一个传递相同指针的级联瀑布,膨胀了你的接口文件和构造函数.想象一下,如果不是1个模型,则需要跟踪5个模型对象.对于5个模型有5个指针的对象是否有意义需要每次都传递给构造函数?这是如何使您的项目有缺陷和不可维护.
如果不是很明显.AppDelegate只是一个单身人士.当你在app delegate中滚动所有模型时,你没有避免使用单例,你刚刚创建了一个单片模型.
关于KVO:这取决于你想要完成的事情.我将举例说明KVO的用处.假设您有一个存储应用程序用户首选项的模型对象.
@interface SettingsModel
.....
@property (nonatomic, retain) UIColor * backgroundColor;
@end
Run Code Online (Sandbox Code Playgroud)
应用程序中的其他视图应在此设置更改时立即更新其背景颜色.使用KVO可以轻松解决这个问题:
[[SettingsModel getInstance] addObserver:self forKeyPath:@"backgroundColor" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"backgroundColor"]){
self.view.backgroundColor = [[SettingsModel getInstance] backgroundColor];
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3147 次 |
| 最近记录: |