【问题标题】:What is the best way to update a model object through a model-controller (API wrapper) only仅通过模型控制器(API 包装器)更新模型对象的最佳方法是什么
【发布时间】:2013-11-03 21:46:09
【问题描述】:

我有一个 iOS 应用程序,其中包含多个模型类和一个包装类,用于对我用作模型控制器的 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 对象,这很麻烦。有什么帮助吗?

【问题讨论】:

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


    【解决方案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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 2018-06-09
      • 2015-10-15
      • 2011-01-24
      • 2011-03-06
      相关资源
      最近更新 更多