다음 코드를 사용하여 Core Data에서 개체의 ID를 쉽게 얻을 수 있습니다.
NSManagedObjectID *moID = [managedObject objectID];
그러나 특정 개체 ID를 제공하여 핵심 데이터 저장소에서 개체를 가져 오는 방법이 있습니까? 다음과 같이 NSFetchRequest를 사용하여이 작업을 수행 할 수 있다는 것을 알고 있습니다.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID];
[fetchRequest setPredicate:predicate];
그러나 자체 가져 오기 요청을 시작하지 않는 방식으로 수행하고 싶습니다. 어떤 아이디어?
답변
원하는 :
-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID
error:(NSError **)error
해당 ID가있는 저장소에서 개체를 가져 오거나 존재하지 않으면 nil을 가져옵니다.
(주의 : NSManagedObjectContext에는 비슷한 이름의 이름을 가진 두 가지 메서드가 있습니다.이 두 가지 방법은 다음과 같습니다.
-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID
… 제공된 objectID를 사용하여 해당 개체가 실제로 저장소에 있는지 여부에 관계없이 오류 개체를 만듭니다 . 존재하지 않는 경우 NSManagedObjectContext의를 사용하여 먼저 객체를 삽입하지 않으면 오류를 발생시키는 모든 것이 실패합니다 insertObject:
. 내가 찾은 유일한 용도는 ObjectID를 유지하면서 저장소에서 저장소로 개체를 복사하는 것입니다.
-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID
… 이 managedObjectContext에 의해 저장소에서 가져온 경우 해당 ID를 가진 개체를 반환합니다 . 이 방법이 유용하다는 것을 아는 사람이 있으면 의견을 말하십시오.)
[eta .: 첫 번째 방법과 다른 두 방법의 또 다른 중요한 차이점은 existingObjectWithID:error:
오류를 반환하지 않는다는 것입니다. 항상 전체 개체를 가져옵니다. 이를 피하려는 경우 (예 : 큰 blob 속성을 사용하여 가져 오기 비용이 많이 드는 객체로 작업) 오류를 발생시키지 않는 objectWithID:
or 를 사용하여 영리해야합니다 objectRegisteredForID:
. 또는 적절하게 구성된 가져 오기 요청을 사용합니다.]
답변
objectWithID:
찾고있는 방법이며이를 수행하는 데 권장되는 방법입니다. objectWithID:
NSManagedObjectContext를 사용하여이 작업을 수행하는 다른 방법과 달리 필요한만큼만 개체를 끌어옵니다. objectWithID:
백업 저장소로 이동하기 전에 상위 컨텍스트, 영구 저장소 조정자 및 영구 저장소 자체에서 메모리 내 정보를 올바르게 사용합니다.
이는 WWDC 2012 세션 “핵심 데이터 모범 사례” 에서 자세히 다룹니다 .
답변
Swift 5 버전 :
https://developer.apple.com/documentation/coredata/nsmanagedobjectcontext/1506686-existingobject
방법 object(with:)
또는 registeredObject(for:)
. 필요한 것에 따라.