1

我得到了几个由关系链接的 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

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

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

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

但是,由于objective-c 2.0、core-data / cocoa 或iOS 的变化,我发现与该主题相关的所有内容似乎都已过时。例如,在使用启用了 ARC 的 xcode 4.6 时,使用 core-data 建模编辑器自动生成访问器方法似乎不起作用,因为我粘贴的所有内容都是 core-data 生成的 @dynamic 行(参见代码示例以上)。

此外,我发现文档所说的内容有点令人困惑。实现这一点的最佳方法是什么?KVO?自定义访问器?两者兼而有之,甚至完全不同?对于给定的示例,可能的实现会是什么样子?

4

1 回答 1

1

你可以这样做:

@implementation Company
// ...

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

// ...
@end

和类似Personcompany属性。您还想实施didChangeValueForKey:withSetMutation:usingObjects:

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

于 2013-08-18T21:53:14.167 回答