在核心数据中存储大型NSData。是核心数据"智能"当有内存警告时,足以唤起未领先的获取数据?

时间:2014-09-06 17:31:57

标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext

我有一个NSMangedObject自定义类,类似于:

@interface MyManagedObject

@property (nonatomic, retain) NSDate * creationDate;
@property (nonatomic, retain) NSData * imageData;

@end

我想存储大UIImages(在NSData之外转换为NSManagedObject) - 相关view controller负责使用{{1}插入数据库对象使用imageData ....

问题是这些托管对象驱动UIImageJPEGRepresentation数百甚至数千个单元 -

截至目前的流程:

collection view

根据我的理解,@implementation ViewController -(void)insertNewManagedObjectWithImageDataAndUpdateView:(NSData *)data { MyManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([MyManagedObject class]) inManagedObjectContext:sharedContext]; newManagedObject.imageData = data; ... // add more stuff to the object as needed // add to internal datasource [self.myData addObject:newManagedObject]; //update the view self.collectionView performBatchUpdates^{ [self.collectionView insertCellsAtIndexPaths:@[[NSIndexPath indexPathForItem:newItemIndex inSection:0]]; } completion:(BOOL success) { }]; } // UICollectionview datasource - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { SomeCustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; cell.imageData = self.myData[indexPath.row]; return cell; } @end @implementation SomeCustomCell -(void)setImageData:(NSData *)imageData { [self.imageView.image = [UIImage imageWithData:imageData]; } @end 中的“imageData”属性会自动保存到数据库上下文中,但它始终保存在内存中(只要在创建期间设置或在某个时刻通过“managed object”实例获取

我如何“SomeCustomCell”内存中的nilify来保存它,但确保它保存在数据库中?处理这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

不,核心数据本身不会观察到内存警告。应用程序可以根据内存警告适当修剪内存中对象图。

使用适当的参数调用-[NSManagedObjectContext refreshObject:mergeChanges:]将刷新内存中对象和内存中任何未出现故障的属性。未保存的更改将丢失。 调用-[NSManagedObjectContext reset]将从该上下文中清除所有内存中对象。同样,未保存的更改将会丢失。

在集合视图或表格视图中,当它们的单元格离开屏幕时,在模型对象上调用refreshObject:mergeChanges:是很常见的。

“核心数据编程指南”部分Faulting and Uniquing以及Reducing Memory Overhead

中对此进行了介绍