核心数据多上下文导入和故障

时间:2013-03-03 10:47:56

标签: objective-c core-data

我在一些UIViewControllers中使用了一个主NSManagedObjectContext来显示数据(UITableView,列表为Department

3个实体一个Department,其中一对一到Boss,其中多对多到Employee(在这种情况下,employee有一个NSData allow external storage)的(图像)属性。

由于我是批量导入图像,因此我在后台线程中执行此操作,该线程具有自己的NSManagedObjectContext

导入包括创建Boss实体和所有Employee并设置关系。

现在我的问题是:

  • 如果我使用child context main context进行导入和保存,那么即使两个上下文都没有更改,所有图像都会保留在内存中。
  • 如果我使用context with no relation to the main context,则图片不会停留在内存中,但新数据未显示在UIViewController中(显然,因为main context未通知由background context
  • 完成的更改

所以我希望仍然可以在没有内存中的图像的情况下显示更改(这意味着我希望Department知道它具有Boss关系但没有内存中的图像) 。简而言之,我希望在context被保存后,它们就会变成错误。

编辑:我认为问题是当我保存child context时,它与main context合并,并从那里新插入的图像留在内存中:/我不知道如何释放它们(即使有记忆警告,也不会自动释放......)

编辑2:我想我修好了,这就是我所做的:

  • 我使用与child context绑定的main context,我收听了所有NSManagedObjectContextDidSaveNotification以及所有inserted updated我致电refreshObject:mergeChanges:在它上面把它变成了错误。

我注册了所有来自各种情况的通知。

-(void)contextDidSave:(NSNotification*)saveNotification {
    NSManagedObjectContext *defaultContext = saveNotification.object;
    NSArray *insertedObjects = [saveNotification.userInfo valueForKey:@"inserted"];
    if (insertedObject) {
        NSLog(@"INSERTED : %@", insertedObjects);
        for (NSManagedObject *object in insertedObjects) {
            [defaultContext refreshObject:object mergeChanges:NO];
        }
    }
    NSArray *updatedObjects = [saveNotification.userInfo valueForKey:@"updated"];
    if (insertedObject) {
        NSLog(@"UPDATED : %@", updatedObjects);
        for (NSManagedObject *object in updatedObjects) {
            [defaultContext refreshObject:object mergeChanges:NO];
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用refreshObject:mergeChanges:将特定对象转换为错误,并为mergeChanges参数传递NO。

  

将对象转换为错误(标志为NO)意味着对相关托管对象(即对象具有引用的对象)的强引用被破坏,因此您也可以使用此方法修剪对象的一部分想要约束内存使用情况的图表。

Documentation here