1

NSManagedObjectContext在几个 UIViewControllers 中使用了一个 main 来显示数据(这是一个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];
        }
    }
}
4

1 回答 1

1

您可以使用 将特定对象变成故障refreshObject:mergeChanges:,为 mergeChanges 参数传递 NO。

将对象变为故障(标志为 NO)意味着对相关托管对象(即对象具有引用的对象)的强引用被破坏,因此您也可以使用此方法修剪您想要的对象图的一部分限制内存使用。

文档在这里

于 2013-03-03T11:21:45.657 回答