name initial content iphone core-data

iphone - meta name viewport content width device width initial scale 1



¿Cuál es la diferencia entre-objectRegisteredForID: y-existingObjectWithID: error:? (4)

¿Qué son los objetos "registrados"?

A juzgar por los resultados que obtuve usando estos métodos, un objeto registrado es uno que ha sido captado en el MOC. Si un objeto existe en el almacenamiento persistente pero no se ha recuperado, alimentar su ID de objeto al método objectRegisteredForID devolverá cero.

¿Cómo podría tener su ID de objeto si no se hubiera obtenido? Bueno, visité esta pregunta cuando implementé una rutina de reversión. Eliminé cualquier cambio no guardado al reemplazar la base de datos con una copia anterior, borré el contexto y luego volví a procesarlo. Pero quería poder restaurar la selección de objetos del usuario en la memoria caché de una tabla. Entonces, antes de hacer la reversión, escondí los objectIDs que el usuario había seleccionado en una matriz. Luego, después de la reversión, reconstruí la memoria caché de la tabla usando los objectID ocultos.

Cuando llamé a objectRegisteredForID utilizando estos objectID ocultos, siempre devolvía nil. (Pero si probé esto antes de obtener un contexto nuevo, devolvería el objeto correspondiente, que en ese momento era un objeto cargado y cargado. De ahí mi inferencia sobre el significado de "registrado").

Cuando llamé a objectWithID usando estos objectIDs ocultos, todo estaba bien a menos que el objeto se hubiera eliminado después de la última vez que guardó, en cuyo caso ya no existiría en la base de datos y el retorno inválido pero no nulo causaría excepciones más adelante.

Entonces usé existingObjectWithID:error . Si el objeto aún existía, sería devuelto. Si ya no existía, la devolución sería nula y la descripción localizada del error sería "Intento de acceder a un objeto que no se encuentra en la tienda".

¿Cuál es la diferencia entre obtener un objeto gestionado con

- (NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID

y

- (NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID error:(NSError **)error

¿Qué son los objetos "registrados"? ¿Cuál es la diferencia entre objetos "registrados" y objetos "no registrados"?


Para su primera pregunta:

objectRegisteredForID: es la manera más rápida y fácil de obtener el objeto: devuelve su objeto o devuelve nada, lo que le permite saber que no pudo hacerlo. Usas esto cuando ya sabes por qué el resultado puede ser nulo o no te importa.

existingObjectWithID:error: es similar, ya que devuelve su objeto o nulo pero, además, si pasa un parámetro de error, le dirá POR QUÉ devolvió nulo. Es posible que desee hacerlo si planea realizar algún tipo de informe de errores (un mensaje de registro o alerta) o el manejo de errores (quizás planee realizar diferentes acciones, dependiendo del tipo de error que se devuelva).

EDITAR : además (por documentos), si no hay un objeto gestionado con el ID dado ya registrado en el contexto, el objeto correspondiente se interrumpe en el contexto.

Sugiero que expliques "¿qué son los objetos registrados?" Parte de su pregunta a una pregunta separada para facilitar tanto obtener una mejor respuesta (basada en la línea de asunto que coincide con la pregunta) como ayudar a futuros espeleólogos que puedan venir a buscar una respuesta.


Años después del hecho:

Como sospecha Wienke, los objetos registrados son los que ya están en la memoria para ese contexto. Entonces objectRegisteredForID: devolverá un objeto solo si alguien más lo ha obtenido anteriormente.

objectWithID: devolverá un objeto si actualmente existe en el almacén persistente.

Entonces la distinción realmente importante es:

objectWithID puede ir a la tienda persistente.

Tenga en cuenta el corolario: objectWithID puede tener que realizar una búsqueda. Eso significa cerrar la tienda. Asi que:

  • si la tienda ya está bloqueada por otra persona, objectWithID puede bloquear, mientras que objectRegisteredForID nunca se bloqueará; y
  • suponiendo que tiene una matriz de 30 identificaciones de objeto y ha realizado objectWithID para cada una, posiblemente realice 30 viajes por separado a la tienda; sería mucho más rápido verificar si los objetos ya están registrados y luego, si no hay ninguno, , use un NSFetchRequest para obtener el resto. Tenga en cuenta que un self in X consulta self in X puede aceptar una matriz o conjunto de ID de objeto para devolver objetos reales, aunque eso técnicamente no coincidiría exactamente con el significado normal de Objective-C de ''self''.

Volver a recurrir a NSFetchRequest también es generalmente preferible si tiene alguna ruta de relación que va a necesitar captar previamente. Por lo tanto, es posible que se obtenga bastante rendimiento.


Recientemente me confundí acerca de por qué registeredObject(for objectID: NSManagedObjectID) devolvía el valor nulo, pero había una explicación simple: las instancias de NSManagedObject obtuve no se conservaron: NSManagedObject la información que necesitaba de ellas y las dejo desasignadas, lo que parece para "anular el registro" de ellos desde el contexto del objeto gestionado, aunque podrían recuperarse fácilmente utilizando otros métodos en NSManagedObjectContext . Encuentro la documentación de CoreData realmente terrible: "registrado" es solo una de las muchas distinciones que no están claramente explicadas.