youtubers tesis sobre sirve que para libros investigaciones investigacion historia caracteristicas ios core-data concurrency nested nsmanagedobjectcontext

tesis - Datos principales: ¿Los contextos secundarios alguna vez obtienen ID de objeto permanentes para objetos recién insertados?



tesis sobre youtube pdf (3)

Tengo una aplicación con dos configuraciones de contextos de objetos administrados como esta:

  • Contexto principal: NSPrivateQueueConcurrencyType, vinculado a la tienda persistente.
  • Contexto principal: NSMainQueueConcurrencyType, hijo del contexto principal.

Cuando inserto un nuevo objeto gestionado en el contexto principal, guardo el contexto principal y luego el contexto principal como este:

[context performBlockAndWait:^{ NSError * error = nil; if (![context save: &error]) { NSLog(@"Core Data save error %@, %@", error, [error userInfo]); } }]; [parentContext performBlock:^{ NSError *error = nil; BOOL result = [parentContext save: &error]; if ( ! result ) { NSLog( @"Core Data save error in parent context %@, %@", error, [error userInfo] ); } }];

Tengo entendido que cuando el objeto de administración se crea por primera vez, tiene un objectID temporal. Luego se guarda el contexto principal y este objeto, con su ID temporal, llega al contexto principal. Entonces el contexto principal se guarda. Cuando se guarda este último contexto, el objectID de objectID temporal en el contexto principal se transforma en un objectID permanente.

Asi que:

  • ¿El identificador de objeto permanente se propaga automáticamente al contexto principal (secundario)?
  • Cuando [NSManagedObjectContext obtainPermanentIDsForObjects:error:] a obtener el ID permanente del objeto con [NSManagedObjectContext obtainPermanentIDsForObjects:error:] , [NSManagedObjectContext obtainPermanentIDsForObjects:error:] fondo de la aplicación, lo reactiva, lo objectWithID: cargar, obtengo el objeto usando el objeto objectWithID: del contexto principal, y objectWithID: a una propiedad, obtengo

    "CoreData no pudo cumplir una falla por ...".

¿Qué está mal con este enfoque?

Como dijo Jody anteriormente, al crear un NSManagedObject nuevo en una cadena de fondo utilizando un ManagedObjectContext hijo, debe forzar la creación de una ID permanente haciendo lo siguiente ANTES de guardar:

NSError *error = nil; [threadedMOC obtainPermanentIDsForObjects:threadedMOC.insertedObjects.allObjects error:&error]; BOOL success = [threadedMOC save:&error];

En mi humilde opinión, no es realmente intuitivo hacerlo de esta manera. Después de todo, ¡está pidiendo una ID permanente ANTES de que ahorre! Pero esta es la forma en que parece funcionar. Si solicita la identificación permanente después de guardar, entonces la identificación seguirá siendo temporal. Desde Apple Docs, puedes usar lo siguiente para determinar si el ID del objeto es temporal:

BOOL isTemporary = [[managedObject objectID] isTemporaryID];


El problema todavía existe en la Solución iOS 8.3 en Swift:

func saveContext(context: NSManagedObjectContext?){ NSOperationQueue.mainQueue().addOperationWithBlock(){ if let moc = context { var error : NSError? = nil if !moc.obtainPermanentIDsForObjects(Array(moc.insertedObjects), error: &error){ println("/(__FUNCTION__)/n /(error?.localizedDescription)/n /(error?.userInfo)") } if moc.hasChanges && !moc.save(&error){ println("/(__FUNCTION__)/n /(error?.localizedDescription)/n /(error?.userInfo)") } } } } func saveBackgroundContext(){ saveContext(self.defaultContext) privateContext?.performBlock{ var error : NSError? = nil if let context = self.privateContext { if context.hasChanges && !context.save(&error){ println("/(__FUNCTION__)/n /(error?.localizedDescription)/n /(error?.userInfo)") }else { println("saved private context to disk") } } } }

Dónde:

  • defaultContext tiene concurrencyType .MainQueueConcurrencyType
  • privateContext tiene concurrencyType .PrivateQueueConcurrencyType

Es un error conocido, que se soluciona pronto, pero, en general, es suficiente obtener una identificación permanente, siempre que lo haga antes de guardar los datos en el primer hijo, y solo incluya los objetos insertados:

[moc obtainPermanentIDsForObjects:moc.insertedObjects.allObjects error:&error]

En algunos casos complejos, es mejor obtener una identificación permanente tan pronto como cree la instancia, especialmente si tiene relaciones complejas.

¿Cómo y cuándo llama a obtainPermanentIDsForObjects ?

No sigo la parte sobre la falla de la aplicación. Tal vez una mejor explicación sería de ayuda.