4

Dans un UITableViewController, j'utilise un NSFetchedResultsController pour mes données. Tout fonctionne bien, sauf lorsque je commence à importer des objets dans un thread séparé: j'utilise un NSOperationQueue dans lequel j'insère des objets dans mon ManagedObjectContext. Cela se produit dans une vue séparée. Le NSFetchedResultsController ne semble pas comme ça et écrit à la console:NSFetchedResultsController et NSOperation

erreur d'application grave. Une exception a été interceptée par le délégué de NSFetchedResultsController lors d'un appel à -controllerDidChangeContent: Tentative de création de deux animations pour la cellule avec userInfo (null)

Apparemment, il tente d'extraire les nouveaux objets.

Sur le sujet de la concurrence, le Core Data Programming Guide dit quelque chose comme l'utilisation d'un ManagedObjectContext pour chaque thread, mais cela semble plutôt compliqué.

maintenant je ne sais pas si je devrais effectivement créer ma propre NSOperation sous-classe, la création d'un ManagedObjectContext en elle et ainsi de suite, ou s'il est possible d'empêcher la NSFetchedResultsController de mettre à jour pendant un certain temps?

Je vous serais reconnaissant de l'aide, Fabian

+0

Je vais avoir le même verrou de côté iOS 5 est sorti. Une fois que je change une entrée dans ma vue de détail, je retourne à la table principale et c'est fermé. Mon application fonctionne correctement sur iOS 4. Elle se verrouille à chaque fois que l'utilisateur modifie une ligne dans la table. Quelque chose de nouveau avec iOS 5? Qu'est ce qui a changé? – RyeMAC3

Répondre

4

Vous avez besoin d'un NSManagedObjectContext par fil, désolé!

Ce n'est pas seulement NSFetchesResultsController qui accédera à votre contexte - coreData ne récupérera pas certaines données tant que vous n'en aurez pas besoin dans votre contexte.

Toutefois, seul le contexte est créé pour chaque thread. Écrivez simplement une méthode sur votre délégué qui crée un contexte d'objet géré et appelez cela dans chacune de vos NSOperations - ceci les fera par thread au lieu de tous en utilisant le même.

Le contexte géré sur votre thread principal peut également être créé avec cette méthode.

+0

Dois-je synchroniser d'une façon ou d'une autre les différents 'ManagedObjectContext' lorsque j'ai terminé l'importation ou est-ce que' PersistentStoreCoordinator' le fera? – fabian789

+2

Lorsque vous appelez save sur le contexte d'objet géré, il met à jour la base de données sous-jacente et génère une notification NSManagedObjectContextObjectsDidChangeNotification. Cependant, je n'ai jamais utilisé cela, j'ai toujours fait la notification moi-même (soit par un délégué ou une notification de mon propre). Vous devrez faire attention aux passages d'objets entre les threads, car cela provoque des plantages aléatoires - retransmettez leurs identifiants au thread principal et récupérez-les dans le contexte de l'objet géré des threads principaux. – deanWombourne

+1

OK, je vais coder maintenant. Vous voudrez peut-être ajouter ceci à votre réponse, cela semble plutôt utile: http://www.duckrowing.com/2010/03/11/using-core-data-on-multiple-threads/ – fabian789