我试图在使用字典将它们插入上下文之前分配 NSManagedObject 的属性值。我遇到的问题是对象值在插入后被归零。
我正在根据以下文档工作:
NSManagedObject
- (id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context
NSManagedObject 使用动态类生成来支持 Objective-C 2 属性特性(参见“声明的属性”),通过自动创建适合于 entity.initWithEntity:insertIntoManagedObjectContext 的类的子类:因此返回实体的适当类的实例。动态生成的子类将基于实体指定的类,因此在模型中指定自定义类将取代传递给 alloc 的类。
如果 context 不是 nil,则调用此方法[context insertObject:self]
(这会导致调用 awakeFromInsert)。
这意味着我可以在上下文之外创建一个 NSManagedObject,执行任何必要的操作,然后自己使用[context insertObject:self]
使用它,我为 NSManagedObject 实现如下:
-(id)initWithDictionary:(NSDictionary *)dict withEntityForName:(NSString *)name insertIntoContext:(NSManagedObjectContext *)context {
NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:context];
self = [self initWithEntity:entity insertIntoManagedObjectContext:nil];
if (self != nil) {
//Assign all primitive properties
[self primitiveRefreshFromDictionary:dict];
if (context != nil)
[context insertObject:self];
}
return self;
}
根据我的日志,该对象已成功初始化并分配了它的所有属性,但是一旦获取,所有对象属性都为零。于是我又读了一些,发现:
从插入唤醒
当接收器首次插入托管对象上下文时,由 Core Data 框架自动调用。
- (void)awakeFromInsert
您通常使用此方法来初始化特殊的默认属性值。此方法在对象的生命周期中仅调用一次。
我想如果有任何地方的值会被归零,那就是它。想象一下我实施时的惊喜
-(void)awakeFromInsert {
if (![self primitiveValueForKey:@"wid"]) {
NSLog(@"Nil values here...");
[super awakeFromInsert];
}
}
并且日志从未出现过。然而,在插入之后,所有属性都为零(稍后修改值棒)。
所以,我的问题是,如何在插入棒之前制作属性值或将该字典携带到 awakeFromInsert 中,以便我可以在那里分配值(因为文档说这是应该分配它们的地方)。
在我得到关于“为什么”的问题之前,这是答案。我需要尽可能减少人为的开销。一切都非常耗费资源,尤其是通过 NSFetchedResultsController 连接到 UITableView。非常常见的事件会触发每个对象的 12 次插入 + 15 次属性更改。我从中获得的最大好处是减少了我获得的大量 ping:
-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
特别是对于由排序属性更改引起的移动事件。
非常感谢任何帮助。
干杯,Z