Zapisywanie w kontekście CoreData na wątku w tle
Od jakiegoś czasu zmagam się z tym problemem, a dokumentacja Apple i SO nie pomogły do tej pory. Korzystałem z ManagedObjectContext na UIManagedDocument i poniższy kod działał bez zarzutu. Następnie zdecydowałem się użyć szablonu Apple dla CoreData w AppDelegate, więc model, stały koordynator sklepu i kontekst są tworzone w AppDelegate. Pobieranie z kontekstu AppDelegate nie jest problemem, ale problemem jest zapisywanie w tle. Powinienem mieć lokalny kontekst w wątku, który zapisuję i jak Apple, aby mieć tego samego koordynatora sklepu. Ale poniższy kod nie zapisuje danych. Czy ktoś może tutaj doradzić? Dziękuję Ci.
- (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];
});
}
}];
}
});
}