ios - reconocedor - ¿Cómo obtener el objeto de datos básicos desde la identificación de objeto específica?
reconocedor de objetos (2)
Usted quiere:
-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID
error:(NSError **)error
Obtiene el objeto de la tienda que tiene esa ID, o nulo si no existe.
(Tenga en cuenta: hay dos métodos en NSManagedObjectContext con nombres parecidos que me hicieron tropezar. Para ayudar a mantenerlos en línea, esto es lo que hacen los otros dos:
-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID
... creará un objeto de falla con el ID de objeto provisto, ya sea que ese objeto exista o no en la tienda. Si no existe, todo lo que active la falla fallará a menos que inserte primero el objeto con insertObject de insertObject:
El único uso que he encontrado para esto es copiar objetos de tienda en tienda mientras conserva ObjectID.
-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID
... devolverá el objeto que tiene esa ID, si ha sido extraído de la tienda por este managedObjectContext. Si alguien sabe para qué sirve este método, coméntelo).
[eta .: Otra diferencia importante entre el primer método y los otros dos es que existingObjectWithID:error:
nunca devuelve un error; siempre busca el objeto completo para ti. Si intenta evitar eso (por ejemplo, trabajar con un objeto costoso de buscar con una gran propiedad de blob), debe ser inteligente con objectWithID:
o objectRegisteredForID:
que no objectRegisteredForID:
fallas; o use una solicitud de recuperación configurada correctamente.]
Puedo obtener fácilmente el ID de un objeto en Core Data usando el siguiente código:
NSManagedObjectID *moID = [managedObject objectID];
Sin embargo, ¿hay alguna manera de sacar un objeto del almacén de datos central dándole un ID de objeto específico? Sé que puedo hacer esto usando una NSFetchRequest, como esta:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID];
[fetchRequest setPredicate:predicate];
Sin embargo, me gustaría hacerlo de una manera que no inicie su propia solicitud de búsqueda. ¿Algunas ideas?
objectWithID:
es el método que está buscando, y es la forma recomendada de hacerlo. objectWithID:
usará de manera eficiente el NSManagedObjectContext para arrastrar el objeto solo a tantos niveles como sea necesario, a diferencia de algunos de los otros medios para hacerlo. objectWithID:
usará correctamente la información en memoria en los contextos principales, el coordinador de tienda persistente y la tienda persistente antes de ir al almacenamiento de respaldo.
Esto se trata en profundidad en la sesión de la WWDC 2012 "Mejores prácticas de datos centrales".