仅通过模型控制器(API包装器)更新模型对象的最佳方法是什么

时间:2013-11-03 21:46:10

标签: objective-c cocoa design-patterns model-view-controller

我有一个iOS应用程序,它有几个模型类和一个包装类,用于调用我用作模型控制器的Web服务。

以下是一个简单模型对象的示例。

@interface Person : NSObject

@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;

+ (Person *)personWithFirstName:(NSString *)firstName lastName:(NSString *)lastName;

@end

要从Web服务检索此对象,我有一个模型控制器,我在其中实现了以下方法。

- (NSArray *)allPeople;
- (void)addPerson:(Person *)newPerson;
- (void)deletePerson:(Person *)newPerson;

目前这很棒。但是,我现在正在添加编辑功能,我也想将其包装在模型控制器中,但我不确定如何构建它的最佳方法。显然,更新Person对象的最简单方法是直接访问对象的属性。但目前模型对象对Web服务一无所知,我想保持这种方式。我可以在模型控制器中添加一个方法,例如

- (void)updatePerson:(Person *)person withFirstName:(NSString *)newFirstName

或类似的东西,并在Person对象上只读取属性,但这似乎不太直观。不过,如果不在模型类中添加控制器代码,我无法想到任何其他方法。这似乎是处理这种情况的适当方式吗?还有其他选择吗?

更新 我不知道上面的想法,但是由于模型控制器类需要以某种方式访问​​和更新这些属性,因此我无法在模型对象上只读取属性。这意味着可以绕过api包装器直接更新person对象,这将是麻烦的。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

首先,Person属性不应该是readonly。 您的API应具有带此签名的updatePerson方法:

- (void)updatePerson:(Person*)person;

您的人应该拥有某种唯一ID,因此当您尝试更新时,可以识别它。 当您需要更新某个人时,您将执行以下操作:

// first - create the object
Person *p = [[Person personWithFirstName:@"John" lastName:@"Appleseed"];
[apiObject addPerson:p];
// then you can update
p.fisrtName = @"Kate";
[apiObject updatePerson:p];