gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:32:20 24 4
gpt4 key购买 nike

我试图在使用字典将 NSManagedObject 的属性值插入上下文之前分配它们。我遇到的问题是对象值在插入后归零。

我正在根据文档工作:

NSManagedObject

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

NSManagedObject 通过自动创建适用于实体的类的子类,使用动态类生成来支持 Objective-C 2 属性功能(参见“声明的属性”)。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

Invoked automatically by the Core Data framework when the receiver is first inserted into a managed object context.

- (void)awakeFromInsert

You typically use this method to initialize special default property values. This method is invoked only once in the object's lifetime.

我想如果有任何地方的值(value)会被清零,那就是这个地方。想象一下我实现时的惊喜

-(void)awakeFromInsert {
if (![self primitiveValueForKey:@"wid"]) {
NSLog(@"Nil values here...");
[super awakeFromInsert];
}
}

而且日志从未出现。然而,在插入之后,所有属性都为 nil(稍后对值的修改保持不变)。

所以,我的问题是,如何在插入之前创建属性值 将该字典携带到 awakeFromInsert 中,以便我可以在那里分配值(因为文档说应该在此处分配值)。

在我回答“为什么”的问题之前,这里是答案。我需要尽可能地减少开销。一切都非常耗费资源,尤其是通过 NSFetchedResultsController 连接到 UITableView 时。非常常见的事件会触发每个对象的 12 次插入 + 15 次属性更改。我从中得到的最大好处是减少了我收到的空洞的 ping 数量:

-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

特别是对于已排序属性的变化引起的 Move 事件。

非常感谢任何帮助。

干杯,Z

最佳答案

上面的代码实际上工作得很好。

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

干杯。

关于ios - 在插入之前分配 NSManagedObject 属性不会坚持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11550279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com