첫 번째 질문은 두 이미지가 동일한 이미지를 사용하는 시점을 어떻게 식별 할 계획입니까? 설정 한 이미지가 이미 존재하는지 여부를 확인하기 위해 저장하고 쿼리 할 수있는 이미지의 속성이 있습니까? 그리고 계산적으로 얼마나 비쌉니까? 시간이 오래 걸리는 경우 저장 용량을 최적화하고 성능에 영향을 미칠 수 있습니다.
그러나 이렇게 효율적으로 수행하는 방법이 있다면 설명하는대로 ImageBlob
엔티티를 만들 수 있습니다. ImageBlob
을 사용하는 엔티티는 ImageBlob
과 imageBlob
또는 imageBlobs
관계 여야합니다. ImageBlob
은 예를 들어 users
과 같은 이름과 반대의 관계를 가져야합니다.
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
당신이 생각하는 것이 좋습니다 또 다른 고려 사항이 더입니다 모양과 함께 할 것입니다 : 당신이 ImageBlob
을 다시 사용하려는 코드에서는
는,이 같은 일을만큼 간단합니다 더 이상 필요합니다. 아마, 당신은 사용되지 않는 이미지를 드롭 싶어요. 이렇게하려면 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];
}
}
감사합니다. 유용한 제안입니다. 그것은 완벽한 해결책은 아니지만 나는 그 대답을 받아들입니다. –