2016-08-17 1 views
1

Je rencontre des problèmes avec un contexte d'objet géré parent/enfant dans iOS. Je rappelle qu'un cas d'utilisation standard consiste à utiliser un contexte d'objet géré enfant temporaire, afin que l'utilisateur puisse décider d'appuyer sur sauvegarder et propager les modifications au parent via des appels save(), ou les modifications de l'utilisateur peuvent être abandonnées. Moc disparaître.Enregistrer l'objet de l'enfant NSManagedObjectContext non disponible dans le parent

Je crée l'enfant comme celui-ci:

childMoc = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 
childMoc.parentContext = parentMoc 

Et puis-je créer un objet dans le childMoc en utilisant

let objectInChildMoc = NSEntityDescription.insertNewObjectForEntityForName(... 

Après avoir fini peuplant mon nouvel objet brillant avec toutes ses variables nécessaires et un deux objets dépendants, j'utilise ce code dans Swift pour tenter d'accéder au nouvel objet à partir du contexte parent:

childMoc.performBlock({ 
    do { 
     try childMoc.save()  
     parentMoc.performBlock({ 
      do { 
       try parentMoc.save()     
       do { 
        let objectInParentMoc = try parentMoc.existingObjectWithID(objectInChildMoc.objectID) as? TheRightType     
       } catch { 
        print("Couldn't find object in parent") 
       }  
      } catch { 
       print("Couldn't save parent") 
      } 
     }) 
    } 
    catch { 
     print ("Couldn't save child") 
    } 
}) 

Je reçois toujours "Impossible de trouver l'objet dans le parent". Qu'est-ce que je rate? Je vois un ancien exemple de code qui utilise les notifications de sauvegarde NSManagedObjectContext, mais j'ai lu que celles-ci ne sont plus nécessaires avec le contexte d'objet géré parent-enfant. Le code ci-dessus est basé sur le récent code ObjectiveC que les gens disent fonctionner (mais avec les trucs try/catch de swift autour de lui.) Par exemple, ce lien Correct implementation of parent/child NSManagedObjectContext me suggère que la configuration ci-dessus devrait fonctionner.

+0

Juste pour clarifier - l'objet est sauvegardé dans le MOC parent. Si je fais un fetch plus tard, je le trouve. Ainsi, l'objet existingObjectWithID semble être la mauvaise méthode pour rechercher un objet dans un contexte d'objet géré parent. –

+0

J'ai essayé d'ignorer tout l'appel 'existingObjectWithID', et le code semble fonctionner jusqu'à ce que nous essayions de supprimer un objet, puis il se plaint de devoir supprimer un objet du mauvais contexte. –

Répondre

0

D'accord, c'est un bug! Bug connu depuis de nombreuses années, mais seulement documenté dans StackOverflow. La réponse est ici https://stackoverflow.com/a/11996957/2073793

Il faut obtenir ids d'objet permanent en utilisant obtainPermanentIDs(for:) avant sauver dans le contexte de l'enfant. Ensuite, ces ObjectIds permanents peuvent être utilisés pour récupérer les objets à partir du contexte parent.