核心数据查询在托管对象上下文中插入新对象

时间:2014-09-24 18:44:45

标签: macos core-data nsmanagedobjectcontext

我的OSX应用程序中有一个方法可以获取给定类型的所有元素(GEElementType是一个枚举)。它在大多数情况下工作正常,但在某些情况下[NSManagedObjectContext executeFetchRequest:error:]最终会多次调用[NSManagedObject initWithEntity:insertIntoManagedObjectContext:]向MOC添加新对象......这是一个预期的行为吗?我可以一致地重现这一点,但我不明白它为什么会这样。

这是一段代码摘录:

+ (NSArray*)elementsOfType:(GEElementType)elementType
{
    return [GEElement findAllObjectsWithPredicate:[NSPredicate predicateWithFormat:@"elemtype == %d", elementType]];
}

+ (NSArray*)findAllObjectsWithPredicate:(NSPredicate*)predicate
{
    NSManagedObjectContext* context = [GEDataManager sharedInstance].managedObjectContext;

    NSEntityDescription* entity = [self entityDescription];
    NSFetchRequest* request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];
    [request setPredicate:predicate];

    NSError* error = nil;
    NSArray* result = [context executeFetchRequest:request error:&error];
    if (error)
    {
        NSLog(@"%@", error.localizedDescription);
    }

    return result;
}

如果它有任何区别,我正在使用带有自定义基础NSManagedObject子类的Mogenerator。

我在子类'init中添加了一个断点,这里是堆栈跟踪:

#0  0x000000010003bf5a in -[GEElement initWithEntity:insertIntoManagedObjectContext:] at /.../DataModel/Human/GEElement.m:27
#1  0x00007fff89166abc in -[NSManagedObject(_NSInternalMethods) _initWithEntity:withID:withHandler:withContext:] ()
#2  0x00007fff8916540e in -[NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:optionalHandler:withInlineStorage:] ()
#3  0x00007fff891be7f6 in -[NSMappedObjectStore executeFetchRequest:withContext:] ()
#4  0x00007fff89154e63 in -[NSPersistentStoreCoordinator executeRequest:withContext:error:] ()
#5  0x00007fff89152c1b in -[NSManagedObjectContext executeFetchRequest:error:] ()
#6  0x000000010000e50c in +[GEDataModelBase findAllObjectsWithPredicate:] at /.../DataModel/GEDataModelBase.m:72
#7  0x00000001000c04da in +[GEElementTypes elementsOfType:] at /.../Helpers/GEElementTypes.m:75
...etc...

编辑:这是GEElement init方法,根据要求。第27行是第一行。

- (id)initWithEntity:(NSEntityDescription*)entity insertIntoManagedObjectContext:(NSManagedObjectContext*)context
{
    self = [super initWithEntity:entity insertIntoManagedObjectContext:context];
    if (self)
    {
        // ...A bunch of property initializations here...
    }
    return self;
}

如果有必要,我可以发布所有属性初始化,但那里没有任何花哨的东西。

1 个答案:

答案 0 :(得分:0)

好的......所以我终于弄清楚我的应用程序上发生了什么导致了这个问题。

经过一番挖掘后,我发现在多次插入问题发生之前发生了另一个意外行为:我的一群GEElement被释放但未被从MOC中删除。我不小心删除了一些对象,这些对象是唯一一个对它们有强烈引用的数组。所以我在创建MOC时添加了以下内容来解决我的问题:

managedObjectContext.retainsRegisteredObjects = YES;

显然,MOC没有保留对象并且它们已经被释放但是当我尝试运行查询时,它重新创建了丢失的对象......这是预期的行为吗?

相关问题