[ios] 특정 개체 ID에서 Core Data 개체를 가져 오는 방법은 무엇입니까?

다음 코드를 사용하여 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:). 필요한 것에 따라.


답변