在插入之前分配NSManagedObject属性不会粘连

时间:2012-07-18 21:00:25

标签: ios core-data nsmanagedobject nsmanagedobjectcontext nsentitydescription

我正在尝试在使用字典将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;
}

根据我的日志,对象被成功初始化并分配了它的所有属性,但是一旦获取,所有对象属性都是零。所以我读了一些,发现:

  

awakeFromInsert

     

当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 个答案:

答案 0 :(得分:1)

上面的代码实际上非常有效。

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

干杯。