在插入之前分配 NSManagedObject 属性不会坚持

Posted

技术标签:

【中文标题】在插入之前分配 NSManagedObject 属性不会坚持【英文标题】:Assigning NSManagedObject properties before insertion doesn't stick 【发布时间】:2012-07-18 21:00:25 【问题描述】:

我正在尝试分配 NSManagedObject 的属性值,然后再使用字典将它们插入上下文。我遇到的问题是对象值在插入后被归零。

我正在根据以下文档工作:

NSManagedObject

- (id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context

NSManagedObject 使用动态类生成来支持 Objective-C 2 属性特性(请参阅“声明的属性”),通过自动创建适合于 entity.initWithEntity:insertIntoManagedObjectContext 的类的子类:因此为实体返回适当类的实例.动态生成的子类将基于实体指定的类,因此在模型中指定自定义类将取代传递给 alloc 的类。

如果上下文不为零,则此方法调用[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;

根据我的日志,该对象已成功初始化并为其分配了所有属性,但一旦获取,所有对象属性均为零。于是我又看了一些,发现:

wakeFromInsert

由 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:

尤其适用于排序属性变化引起的 Move 事件。

非常感谢任何帮助。

干杯,Z

【问题讨论】:

【参考方案1】:

上面的代码实际上完美运行。

有人在 +Extras 文件中覆盖了 awakeFromInsert,这使值无效。外包代码。不利于你的理智。

干杯。

【讨论】:

以上是关于在插入之前分配 NSManagedObject 属性不会坚持的主要内容,如果未能解决你的问题,请参考以下文章

具有强制关系的 NSManagedObject

创建新的 NSManagedObject 并将其分配给新的 NSManagedObject *有时*会失败

在索引 0 处插入元素,NSManagedObject

如何在 swift 中将子类 NSManagedObject 分配给 var(而不是常量)

如何在其他 NSManagedObjectContext 中插入 NSManagedObject?

将获取的 NSManagedObject 分配给属性