문제

이미지 데이터를 저장하는 여러 가지 속성을 가진 여러 엔티티가 포함 된 데이터 모델이 있습니다. 이것들은 모두 작은 이미지가 될 것이며 외부 파일이 아닌 지속적인 상점에 저장해야합니다.

이미지 데이터를 바이너리 또는 변환 가능한 속성으로 저장할 수는 있지만 사용자는 이러한 속성 중 두 개 이상에 대해 동일한 이미지를 지정할 가능성이 높으므로 이미지를 복제하는 대신 각각의 고유 한 이미지의 하나의 사본을 저장하는 것입니다. 데이터.

나는 이미지 데이터를 저장하기 위해 "ImageBlob"엔티티를 만들고 관계를 사용 하여이 작업을 수행하는 데 엉망이되었지만 핵심 데이터가있는 초보자이며 이것이 올바른 방법이라면 즉시 분명하지 않습니다. 특히 다음 상황을 어떻게 처리합니까?

  • 여러 엔티티의 모든 이미지 속성이 동일한 "이미지 데이터 저장소"를 사용하여 각 이미지 블로브의 하나의 인스턴스 만 저장되도록합니다.
  • 객체가 데이터 저장소에서 이미지를 사용하지 않으면 제거되어야합니다.

이것을 처리하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

첫 번째 질문은 두 객체가 동일한 이미지를 사용할 때 어떻게 식별 할 계획입니까? 이미지에 이미 존재하는지 여부를 결정하기 위해 저장하고 쿼리 할 수있는 이미지에 속성이 있습니까? 그리고 얼마나 비싸고 계산적입니까? 시간이 많이 걸리면 스토리지를 최적화하고 성능에 영향을 줄 수 있습니다.

그러나 효율적으로 수행하는 방법이 있다면 ImageBlob 당신이 묘사하는 것을 할 실체. 사용하는 엔티티 ImageBlobS가 있어야합니다 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];
    }
}

다른 팁

MD5라는 고유 한 속성을 Image 엔티티는 동일한 이미지 만 한 번만 저장하고 있는지 확인합니다.

핵심 데이터에 관해서는 이와 같은 것이 효과가 있다고 생각합니다. 그런 다음 추상적 인 부모 엔티티를 만드십시오 (Parent). 관계를 추가하십시오 Parent 에게 Image ~라고 불리는 image, 삭제시 삭제 방법에 대해 "캐스케이드"를 설정하여 삭제할 때 Parent, Image 또한 삭제됩니다. 관계를 추가하십시오 Image 에게 Parent ~라고 불리는 parent, 삭제할 때 삭제 방법에 대해 "nullify"를 설정하고 Image, 이미지 Parent 설정되었습니다 nil. 그런 다음 다른 엔터티를 추가하고 부모를 Parent.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top