我在一些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];
}
}
}
答案 0 :(得分:1)
您可以使用refreshObject:mergeChanges:
将特定对象转换为错误,并为mergeChanges参数传递NO。
将对象转换为错误(标志为NO)意味着对相关托管对象(即对象具有引用的对象)的强引用被破坏,因此您也可以使用此方法修剪对象的一部分想要约束内存使用情况的图表。