KVO还是自定义访问方法?

时间:2013-08-18 21:26:00

标签: ios core-data key-value-observing

我有几个实体用于iOS应用,这些实体通过关系链接。举一个简单的例子,假设我们得到了这样的关系(一对多):

company <--->> person

我正在使用xcode 4.6和用于模型生成的核心数据建模工具,所以我最终得到了

//Company.h
@class Person;
@interface Company : NSManagedObject
@property (nonatomic, retain) NSString * company_name;
@property (nonatomic, retain) NSNumber *has_changed;
@property (nonatomic, retain) NSSet *person;
@end

@interface Company (CoreDataGeneratedAccessors)
- (void)addPersonObject:(Person *)value;
- (void)removePersonObject:(Person *)value;
- (void)addPerson:(NSSet *)values;
- (void)removePerson:(NSSet *)values;
@end

//Company.m
#import "Company.h"
#import "Person.h"

@implementation Company
@dynamic company_name;
@dynamic has_changed;
@dynamic person;
@end

//Person.h
@class Company;

@interface Person : NSManagedObject
@property (nonatomic, retain) NSString * first_name;
@property (nonatomic, retain) NSString * last_name;
@property (nonatomic, retain) Company *company;
@end

//Person.m
#import "Person.h"
#import "Company.h"

@implementation Person
@dynamic first_name;
@dynamic last_name;
@dynamic company;
@end

现在,假设我想在每次发生下列情况之一时将布尔值(在核心数据中实现为NSNumber)属性has_changed设置为TRUE

  • 公司实体的属性被更改,当然除了has_changed属性本身(因为这会导致循环)
  • 人员实体的属性已更改

什么是最好的(易于实施+快速处理)方式来实现这样的事情?我能够找到的是,有两种选择:

然而,由于objective-c 2.0,core-data / cocoa或iOS的变化,我发现与此主题相关的所有内容似乎都已过时。例如,当启用ARC时使用xcode 4.6时,automatically generating the accessor methods by using the core-data modelling editor似乎不起作用,因为我粘贴的所有内容都是核心数据生成的@dynamic行(参见上面的代码示例)。

此外,我发现文档说的有点令人困惑。 实施此方法的最佳方法是什么?志愿?自定义访问者?这两者甚至是完全不同的东西?对于给定的示例,可能的实现方式如何?

1 个答案:

答案 0 :(得分:1)

你可以这样做:

@implementation Company
// ...

- (void) didChangeValueForKey: (NSString *) key
{ 
   [super didChangeValueForKey: key];
   if (! [key isEqualToString: @"has_changed"])
     self.has_changed = YES;
}

// ...
@end

Person类似company属性。您还想实施didChangeValueForKey:withSetMutation:usingObjects:

请注意,此建议并未解决让控制器了解更改的常见需求。还有其他方法可以做到这一点。