我有几个实体用于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
:
什么是最好的(易于实施+快速处理)方式来实现这样的事情?我能够找到的是,有两种选择:
然而,由于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行(参见上面的代码示例)。
此外,我发现文档说的有点令人困惑。 实施此方法的最佳方法是什么?志愿?自定义访问者?这两者甚至是完全不同的东西?对于给定的示例,可能的实现方式如何?
答案 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:
请注意,此建议并未解决让控制器了解更改的常见需求。还有其他方法可以做到这一点。