Мой первый вопрос: как вы планируете определить, когда два объекта используют одно и то же изображение? Есть ли свойство изображения, которое вы можете сохранить и запросить, чтобы определить, существует ли уже заданное изображение? И насколько это дорого в вычислительном отношении? Если это займет много времени, вы можете оптимизировать систему хранения и повлиять на производительность.
Однако, если у вас есть способ сделать это эффективно, вы можете создать ImageBlob
сущность, чтобы сделать то, что вы описываете. Сущность, которая использует ImageBlob
s, должна иметь отношение imageBlob
или imageBlobs
с ImageBlob
. 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
Еще одно соображение, о котором вы захотите подумать, - что делать с каплями, которые больше не нужны. Предположительно, вы хотите удалить любые изображения, которые не используются. Для этого вы можете зарегистрировать своего делегата приложения или подкласс NSPersistentDocument
(в зависимости от того, основано ли ваше приложение на документе) для уведомления NSManagedObjectContextObjectsDidChangeNotification
. Всякий раз, когда контекст управляемого объекта изменяется, вы можете удалить любые ненужные изображения, например:
- (void)managedObjectContextObjectsDidSave:(NSNotification *)notification {
NSManagedObjectContext *managedObjectContext = [notification object];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntity entityWithName:@"ImageBlob" inManagedObjectContext:managedObjectContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"users.@count == 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];
}
}