L'enregistrement en CoreData Contexte sur le thread d'arrière-plan
Je suis aux prises avec ce pour un certain temps maintenant, et la documentation d'Apple et n'a DONC pas d'aide pour l'instant. J'ai été en utilisant ManagedObjectContext sur un UIManagedDocument et le code ci-dessous a bien fonctionné. J'ai alors décidé de l'utilisation d'Apple modèle pour CoreData dans AppDelegate, de sorte que le modèle, la persistance de coordonnateur du magasin et le contexte est créé dans AppDelegate. L'extraction avec AppDelegate du contexte n'est pas un problème, mais l'enregistrement en arrière-plan est un problème. J'aurais du contexte local sur le fil, je suis d'économie et comme par Apple pour avoir la même persistance coordonnateur du magasin. Mais le code ci-dessous ne fait pas enregistrer les données. Quelqu'un peut ici s'il vous plaît aviser? Merci.
- (void)fetchAndPersist
{
dispatch_queue_t ffetchQ = dispatch_queue_create("ForFetch", NULL);
dispatch_async(ffetchQ, ^{
NSManagedObjectContext *secureManagedObjectContext;
NSPersistentStoreCoordinator *coordinator = [appDelegate persistentStoreCoordinator];
if (coordinator != nil) {
secureManagedObjectContext = [[NSManagedObjectContext alloc] init];
[secureManagedObjectContext setPersistentStoreCoordinator:coordinator];
}
//find missing date
DataManager *dataManager = [[DataManager alloc] init];
NSDate *missingDate = [dataManager findMissingDateFromDate:selectedDate inContext:secureManagedObjectContext];
if (missingDate) {
//fetch and parse data
DataFetcher *dataFetcher = [[dataFetcher alloc] init];
NSDictionary *fetchResponse = [dataFetcher parseDataForDate:missingDate];
//persist it in a block and wait for it
[secureManagedObjectContext performBlock:^{
DataStore *dataStore = [[DataStore alloc] init];
BOOL parsingError = [dataStore persistData:fetchResponse inContext:secureManagedObjectContext];
if (parsingError) {
//handle error
} else {
dispatch_async(dispatch_get_main_queue(), ^{
//perform on main
[self fetchAndPersist];
});
}
}];
}
});
}
Si vous voulez dire par "enregistrement dans un autre thread" le performBlock opération, alors qu'il ne l'est pas. Tout ce que je besoin est le principe le plus simple extraction et à la persistance de fonctionnement de la passe à l'extérieur de thread principal.
Pour clarifier, actuellement, le code va se planter avec le rapport " ne Peut utiliser -performBlock: sur un NSManagedObjectContext qui a été créé avec une file d'attente.' Si je commente la performBlock ligne, le code s'exécute dans une boucle infinie, de sorte que le thread principal ne permet pas de voir les données qui ont été enregistrées.
OriginalL'auteur Martin Koles | 2013-09-15
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser la relation parent /enfant contextes:
http://www.cocoanetics.com/2012/07/multi-context-coredata/
Dans le lien ci-dessus vous pouvez trouver un exemple de code.
OriginalL'auteur Sviatoslav Yakymiv
Votre incident se produit parce que votre
NSManagedObjectContext
est en utilisant l'ancienne, obsolète fil de confinement modèle de Base de Données de la simultanéité:secureManagedObjectContext = [[NSManagedObjectContext alloc] init];
init
est juste un wrapper autour deinitWithConcurrencyType:
avec l'argumentNSConfinementConcurrencyType
. Cela crée le contexte à l'aide du fil de confinement modèle, qui ne peut pas utiliserperformBlock:
ouperformBlockAndWait:
. Seuls les contextes à l'aide de la plus récente (pas obsolète!) la file d'attente de l'accouchement modèle peut utiliser ces méthodes, et d'utiliser ces méthodes pour tout accès au contexte ou à des objets lui appartenant. Pour créer un contexte à l'aide de la file d'attente de l'accouchement et une file d'attente privée:secureManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
Si votre code a été migré à l'aide d'une file d'attente privée contexte, vous pouvez également supprimer votre envoi en série de la file d'attente, comme la file d'attente privée contexte fournit des fonctionnalités équivalentes.
Oui, vous devez utiliser ces méthodes pour obtenir le comportement correct. developer.apple.com/library/ios/releasenotes/DataManagement/...
OriginalL'auteur quellish