Problème Déclaration
J'ai données côté serveur sauver des problèmes de manière asynchrone.sauvegarde IOS de base de données asynchrones
Structure
J'utilise la structure suivante de NSManagedObjectContext afin de parent à l'enfant:
- writerManagedObjectContext (NSPrivateQueueConcurrencyType)
- masterManagedObjectContext (NSMainQueueConcurrencyType)
- backgroundManagedObjectContext (NSPrivateQueueConcurrencyType)
code
J'utilise le code suivant pour enregistrer les données
[backgroundManagedObjectContext performBlock:^{
[backgroundManagedObjectContext save:nil];
[masterManagedObjectContext performBlock:^{ // Starts blocking UI from here
[masterManagedObjectContext save:nil];
[writerManagedObjectContext performBlock:^{
[writerManagedObjectContext save:nil];
}]
}]
}]
Problème
Le code sauve bien. Le backgroundManagedObjectContext
enregistre également de manière asynchrone. Toutefois, masterManagedObjectContext
et writerManagedObjectContext
refusent d'être enregistrés de manière asynchrone et bloquent le thread d'interface utilisateur. (Je sais que ce bloque le thread d'interface utilisateur parce que j'ai essayé d'effectuer des actions qui ont rien à voir avec les données de base et ils ont également été bloqués. Ce n'est pas un cas du coordonnateur persistant ne pas être accessible)
Questions
- Quelle serait la raison pour laquelle le code ci-dessus bloque le thread principal?
- Ai-je raison de supposer que je peux appeler le code ci-dessus de n'importe où puisque le
save
sera appelé dans chaque thread/contexte?
Toute aide serait grandement appréciée.
Modifier
http://floriankugler.com/2013/04/29/concurrent-core-data-stack-performance-shootout/
Apparemment, le gel vient de la tentative de se propager au parent NSManagedObjectContext. L'article semble échapper au fait qu'il est impossible d'avoir une sauvegarde vraiment asynchrone dans le contexte principal.
Les données étaient fortement liées, 5 Mo, et ont pris environ 40 secondes pour enregistrer dans psc. Je ne pense pas que je vais utiliser une structure parallèle comme décrit dans le post puisque la base de code est déjà grande comme elle est. J'apprécierais toutes les stratégies que je peux utiliser pour diminuer ce gel.
J'utilise déjà des MOC imbriqués comme indiqué par la structure. Ma question est pourquoi la sauvegarde n'est pas asynchrone malgré l'utilisation d'une structure MOC imbriquée. – jrhee17
J'ai réalisé que vous utilisiez des contextes imbriqués après avoir relu votre message. Je vais modifier ma réponse. Vous devriez éviter de passer 'nil' au gestionnaire d'erreur' save'. Vous voudrez être capable de réagir aux erreurs. Essayez de vérifier les erreurs et voir si c'est ce qui bloque votre file d'attente principale. Vous avez également mentionné "côté serveur". Utilisez-vous la synchronisation Core Data iCloud? – jp2g
J'utilise mon propre serveur, mais honnêtement, le serveur n'est pas pertinent. Fondamentalement, je suis l'analyse des données json et en les insérant dans les données de base. Je fais la gestion des erreurs - le code ci-dessus est juste pour illustrer ce que mon code ressemble. – jrhee17