¿Cómo search solo ID de object pero también include datos de fila en CoreData?

En CoreData Apple Docs sobre cómo trabajar en segundo plano , encontré este consejo:

Por ejemplo, puede configurar una request de recuperación para devolver solo ID de object, pero también include los datos de la fila (y actualizar la caching de la fila) ; esto puede ser útil si solo va a pasar esos ID de object de un subprocess de background a otro subprocess .

Me preguntaba cómo podría implementar esta request de búsqueda? Específicamente cómo actualizar el caching de fila.

Creo que así es como obtienes las identificaciones:

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"MyItem"]; // iOS 5 method request.returnsObjectsAsFaults = YES; 

¿Cómo hago el rest?

De forma pnetworkingeterminada, includesPropertyValues ​​es YES, y returnsObjectsAsFaults también es YES.

Si solo desea devolver ID de object, debe usar …

 fetchRequest.resultType = NSManagedObjectIDResultType; 

Sin embargo, no se pueden get properties y el caching de fila no se rellenará. Recogerás un grupo de identificadores de objects.

Tenga en count que BY DEFAULT, (resultType == NSManagedObjectResultType), ya que both includesPropertyValues ​​y returnsObjectsAsFaults son YES, una búsqueda devolverá objects como fallas (la ID del object será accesible), y la caching de la fila se llenará, pero los datos no serán realmente estar "en memory" porque el object sigue siendo un error … pero aún puede get su ID de object.

Todo lo que necesita hacer es pedirle al object su ID de object.

Supongo que todo eso para decir que el comportamiento que estás pidiendo es lo que obtienes por defecto. Entonces, ¿estás teniendo un problema o hay alguna razón por la que crees que NO estás obteniendo ese comportamiento?

EDITAR

Ummm … Estoy diciendo que POR DEFAULT, obtienes lo que quieres. Si simplemente completa una request de búsqueda y no cambia ninguno de los attributes, returnsObjectsAsFaults es YES, por lo que los objects que se le devuelven serán fallas. Además, includesPropertyValues ​​también es YES, por lo que en el caching de fila habrá disponible cierta cantidad de datos de propiedad.

Puede acceder a la propiedad objectID llamando, bueno, managedObject.objectID.

EDITAR

Pido disculpas, porque obviamente no estoy haciendo un muy buen trabajo de comunicación porque esta será la tercera vez que he dicho lo mismo.

Cuando crea una NSFetchRequest, tiene varias properties que están establecidas de manera pnetworkingeterminada.

resultType se establece en NSManagedObjectResultType de forma pnetworkingeterminada. Eso significa que, a less que lo cambie, seguirá siendo NSManagedObjectResultType. También significa que la matriz de resultados que obtendrá de una búsqueda contendrá una matriz de NSManagedObjects (en lugar de recuperar un conteo, o un dictionary o ObjectID).

returnsObjectsAsFaults se establece en SÍ de forma pnetworkingeterminada. Eso significa que, a less que lo cambie, seguirá siendo SÍ. También significa que los objects que se devuelven de una búsqueda serán fallas. El NSManagedObject no se realizará con datos de properties. El object será un error. Tendrá suficientes metadatos para conocer su tipo, ID de object y algunas otras cosas.

includesPropertyValues ​​se establece en YES de forma pnetworkingeterminada. Eso significa que, a less que lo cambie, seguirá siendo SÍ. También significa que se obtendrá cierta cantidad de datos de properties en el caching de fila.

Cada NSManagedObject que se devuelve desde la búsqueda:

  1. Tener una identificación de object
  2. Ser un error, por lo que los datos no se cargan completamente en la memory
  3. Alguna cantidad de datos de propiedad estará en el caching de fila

Esto es todo lo que estás pidiendo. No estoy seguro de qué más puedo agregar (sin repetirme una vez más).

Además, tenga en count que si solo desea ID de object, puede establecer resultType en NSManagedObjectIDResultType.

Directamente desde la documentation de NSFetchRequest …

includesPropertyValues

Puede establecer includesPropertyValues ​​en NO para networkingucir la sobrecarga de memory al evitar la creación de objects para representar los valores de las properties. Normalmente, solo debería hacerlo, sin embargo, si está seguro de que no necesitará los datos de properties reales o ya tiene la información en el caching de filas, de lo contrario incurrirá en múltiples viajes a la database.

Durante una búsqueda normal (includesPropertyValues ​​es YES), Core Data obtiene el ID del object y los datos de propiedad para los loggings coincidentes, llena la caching de la fila con la información y devuelve el object gestionado como fallas (vea returnsObjectsAsFaults). Estas fallas son objects gestionados, pero todos sus datos de propiedad aún residen en el caching de fila hasta que se activa el fallo. Cuando se activa el fallo, Core Data recupera los datos del caching de fila; no es necesario volver a la database.

Si includesPropertyValues ​​es NO, entonces Core Data obtiene solo la información de ID de object para los loggings coincidentes: no rellena el caching de fila. Core Data aún devuelve objects gestionados, ya que solo necesita ID de object administrado para crear fallas. Sin embargo, si posteriormente dispara la falla, Core Data busca en la caching de la fila (vacía), no encuentra ningún dato y luego vuelve a la tienda por segunda vez para get los datos.

y…

returnsObjectsAsFaults

El valor pnetworkingeterminado es SÍ. Esta configuration no se utiliza si el tipo de resultado (ver resultadoTipo) es NSManagedObjectIDResultType, ya que los ID de object no tienen valores de propiedad. Puede establecer returnsObjectsAsFaults en NO para get un beneficio de performance si sabe que necesitará acceder a los valores de propiedad de los objects devueltos.

De manera pnetworkingeterminada, cuando ejecuta una búsqueda returnsObjectsAsFaults es SÍ; Core Data obtiene los datos del object para los loggings coincidentes, llena el caching de la fila con la información y devuelve el object administrado como fallas. Estas fallas son objects gestionados, pero todos sus datos de properties residen en el caching de fila hasta que se activa el fallo. Cuando se activa el fallo, Core Data recupera los datos del caching de fila. Aunque la sobrecarga para esta operación es pequeña, para sets de datos grandes puede llegar a ser no trivial. Si necesita acceder a los valores de propiedad de los objects devueltos (por ejemplo, si itera sobre todos los objects para calcular el valor promedio de un atributo particular), entonces es más eficiente establecer devolucionesObjetosAsFaults en NO para evitar la sobrecarga adicional.

Déjame explicarlo de la manera más fácil.

De forma pnetworkingeterminada, NSFetchRequest tiene

 resultType: NSManagedObjectResultType returnsObjectsAsFaults: YES includesPropertyValues: YES 

Aquí, el object de retorno (en memory) solo tiene propiedad de object objectID , todas las demás properties están vacías (Esto es lo que se llama falla )

includesPropertyValues

SÍ: significa que las properties del object están en el caching de las filas (algún caching especial de CoreData), de modo que cuando acceda a esas properties, CoreData las searchá en el caching de filas

NO: significa que no hay caching de fila, al acceder a esas properties, CoreData volverá a consultar SQLite

returnsObjectsAsFaults

SÍ: permitir que includesPropertyValues ​​tenga efecto (significa permitir fallas )

NO: devuelve el object con todas sus properties en la memory

NOTA : hay 2 types de fallas: falla de object gestionado y falla de relación

Lea más aquí Faulting Limits the Size of the Object Graph

Entonces, en tu caso, solo juega con el pnetworkingeterminado