我有一个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
来保存它,但确保它保存在数据库中?处理这个问题的正确方法是什么?
答案 0 :(得分:0)
不,核心数据本身不会观察到内存警告。应用程序可以根据内存警告适当修剪内存中对象图。
使用适当的参数调用-[NSManagedObjectContext refreshObject:mergeChanges:]
将刷新内存中对象和内存中任何未出现故障的属性。未保存的更改将丢失。
调用-[NSManagedObjectContext reset]
将从该上下文中清除所有内存中对象。同样,未保存的更改将会丢失。
在集合视图或表格视图中,当它们的单元格离开屏幕时,在模型对象上调用refreshObject:mergeChanges:
是很常见的。
“核心数据编程指南”部分Faulting and Uniquing以及Reducing Memory Overhead
中对此进行了介绍