我的第一个问题是如何计划确定两个物体何时使用相同的图像?您可以存储和查询图像上的属性,以确定您设置的图像是否已经存在?从计算上来说,这有多昂贵?如果花费很多时间,则可能会优化存储并影响性能。但是,如果您确实有办法有效地完成此操作,则可以创建一个ImageBlob
实体来执行您所描述的操作。使用ImageBlob
的实体应与ImageBlob
有imageBlob
或imageBlobs
关系。 ImageBlob
应该与名称相反,例如users
。
在你的代码,当你想重用ImageBlob
,这是因为做这样的事情非常简单:
NSManagedObject *blob = // get the image blob
NSManagedObject *user = // get the user
[user setValue:blob forKey:@"imageBlob"]; // do this if it uses a single image
[[user mutableSetValueForKey:@"imageBlobs"] addObject:blob]; // do this if it uses multiple images
你要考虑的另一个考虑是如何处理那些没有斑点做需要更长时间据推测,你想删除任何未使用的图像。为此,您可以为NSManagedObjectContextObjectsDidChangeNotification
通知注册您的应用程序委托或NSPersistentDocument
子类(具体取决于您的应用程序是否基于文档)。每当管理对象环境的变化,你可以删除任何不需要的图像是这样的:
- (void)managedObjectContextObjectsDidSave:(NSNotification *)notification {
NSManagedObjectContext *managedObjectContext = [notification object];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntity entityWithName:@"ImageBlob" inManagedObjectContext:managedObjectContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 0"];
NSArray *unusedBlobs = [managedObjectContext executeFetchRequest:fetchRequest error:nil]; // Don't be stupid like me; catch and handle the error
[fetchRequest release];
for (NSManagedObject *blob in unusedBlobs) {
[managedObjectContext deleteObject:blob];
}
}
谢谢,这是一个有用的建议。这不是一个完整的解决方案,但我接受了答案。 – 2009-10-28 01:08:53