打破Cocoa iOS中MVC对象之间的循环依赖关系

时间:2013-09-30 22:41:14

标签: ios cocoa testing model-view-controller tdd

Hello Stackers,

我正在尝试使用TDD在iOS应用程序中实现MVC,但我不断获得模型和控制器之间以及控制器和视图之间的循环依赖关系。我想要紧密匹配图中所示的Cocoa MVC模式。 Apple文档的7.2(https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html)。

问题源于我对init的tdd要求:所有MVC对象及其所有依赖项。我需要初始化所有依赖项,以便在测试期间可以替换模拟。这是我的问题的一个简单例子。

查看:

exampleView.h

//exampleView.h
#import <UIKit/UIKit.h>
#import "exampleViewController.h"

@interface exampleView : UIView

- (id)initWithFrame:(CGRect)frame andVC:(exampleViewController *)VC;

- (void) updateLabelText:(NSString *)newText;

@end

exampleView.m

//exampleView.m
#import "ExampleView.h"
#import "ExampleViewController.h"

@interface exampleView ()

@property (nonatomic) UILabel *label;
@property (nonatomic) UIButton *button;
@property (nonatomic) exampleViewController* VC;

@end

@implementation exampleView
// use your imagination...
@end

控制器:

//exampleViewController.h
#import <UIKit/UIKit.h>
#import "ExampleModel.h"
#import "ExampleRootView.h"

@interface ExampleViewController : UIViewController

- (id) initWithView:(exampleView *)view andModel:(ExampleModel*)model;

- (void) userActionButtonTapped();

@end

模型

//exampleModel.h
#import "exampleViewController.h"
@interface exampleModel : NSObject
-(id)initWithVC:(UIViewController *)VC;
//other model type stuff

@end

现在尝试初始化这些对象时遇到了麻烦。因为它们是循环依赖的,它是一种鸡肉和鸡蛋的情景。

1 个答案:

答案 0 :(得分:2)

设计MVC系统的常规方法是依赖于“向下”或“侧向”(例如,视图取决于控制器,控制器取决于模型,模型仅取决于其他模型)。这与Apple的框架中的视图控制器稍微有点捏造,但仍然广泛适用。让模型依赖于控制器是奇怪的事情 - 为什么这是必要的?听起来可能会有一些不必要的耦合。