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];
                    });
                }
            }];
        }
    });
}
Pourquoi enregistrer dans un autre thread ? Est-il vraiment nécessaire pour ce que vous faites dans ce cas ?
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