1

我有一个 iOS 应用程序,其中包含多个模型类和一个用于 API 调用的包装类,用于对我用作模型控制器的 Web 服务进行 API 调用。

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

@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 对象,这很麻烦。有什么帮助吗?

4

1 回答 1

1

首先,Person 属性不应该是只读的。你的 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];
于 2013-11-04T00:47:30.787 回答