обновляет основные данные в фоновом потоке, например, так:Почему мои основные данные не обновляются?
entry.message = [self contentForNoteWithEDML:note.content];
entry.dataLastModified = [NSDate date];
[entry.managedObjectContext save:nil];
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[self.tableView reloadData];
});
На каждой клетку Tableview, он отображает другую запись из fetchedResultsController
. В основном потоке я делаю NSLog
в cellForRowAtIndexPath
по дате dataLastModified
, и дата не изменяется до последнего значения. Если я закрою приложение и запустил его снова, он обновит содержимое ячейки, а значение даты dataLastModified
изменится на правильное значение.
Похоже, что данные изменяются, если требуется, но мой tableview
не видит изменений до тех пор, пока приложение не будет перезапущено. Любые идеи почему?
EDIT: Выполнение NSLog
в cellForRowAtIndexPath
на фоновом потоке дает правильные данные, но делать это на основной теме нет.
EDIT 2: Как мой фон контекст работы:
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter
addObserver:[AppDelegate applicationDelegate].coreDataManager
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:[AppDelegate applicationDelegate].coreDataManager.managedObjectContext];
NSPersistentStoreCoordinator *journalDataPSC = [AppDelegate applicationDelegate].coreDataManager.managedObjectContext.persistentStoreCoordinator;
dispatch_queue_t addOrUpdateEntriesQueue = dispatch_queue_create("com.App.AddOrUpdateEntries", NULL);
dispatch_async(addOrUpdateEntriesQueue, ^{
NSManagedObjectContext *journalDataMOC = [[NSManagedObjectContext alloc] init];
[journalDataMOC setPersistentStoreCoordinator:journalDataPSC];
//Some code to get me an entry on this context
entry.message = [self contentForNoteWithEDML:note.content];
entry.dataLastModified = [NSDate date];
[entry.managedObjectContext save:nil];
[[NSNotificationCenter defaultCenter] removeObserver:[AppDelegate applicationDelegate].coreDataManager];
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[self.tableView reloadData];
});
});
dispatch_release(addOrUpdateEntriesQueue);
Используете ли вы детский контекст для фонового потока или вручную созданного контекста? Похоже, что изменения не передаются в основной контекст. –
Я использую созданный вручную контекст. Я напишу еще несколько примеров того, как это работает. – Andrew