3

В моем приложении данные хранятся в основных данных в фоновом режиме. Основной управляемый объект-контекст (в appdelegate) уведомляется о каждом сохранении фона с помощью метода уведомления. Я показываю данные в виде таблицы. Я использовал nsfetchedrequestcontroller для автоматического обновления tableview. Я использовал тот же управляемый объект контекста в appdelegate для fetchedresultscontroller. Я получаю данные так, как ожидалось, и табличное представление обновляется для каждого сохранения данных в фоновом режиме. Но иногда табличное представление становится пустым только с одной или двумя ячейками. Я много разбирался в этой проблеме и обнаружил, что данные о неисправностях обрабатываются. Поэтому я изменил управляемый объект-контекст для fetchedresultscontroller на новый управляемый объект-контекст, как сказано в приведенной ниже ссылке.Данные не перезагружаются автоматически в uitableview при использовании nsfetchedresultscontroller

NSFetchedResultsController delegate fired even when context not saved

После делать это я не получаю пустые ячейки, но TableView автоматически не обновляется. Как я могу автоматически обновлять таблицу?

-(NSFetchedResultsController*)mfetchedResultsController 
{ 

if (_mfetchedResultsController != nil) { 
    return _mfetchedResultsController; 
} 

NSString *loginUser=[[NSUserDefaults standardUserDefaults] valueForKey:@"currentUser"]; 

AppDelegate *sharedDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
//NSManagedObjectContext *context = [sharedDelegate managedObjectContext]; 
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init]; 
context.persistentStoreCoordinator = [sharedDelegate persistentStoreCoordinator]; 


NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setReturnsObjectsAsFaults:NO]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ThreadInfo" 
              inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 

NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
          initWithKey:@"threadDate" ascending:NO]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 


NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"userEmail == %@",loginUser]; 

[fetchRequest setPredicate:threadPredicate]; 
[fetchRequest setFetchBatchSize:20]; 
NSFetchedResultsController *theFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
            managedObjectContext:context sectionNameKeyPath:nil 
               cacheName:nil]; 
_mfetchedResultsController = theFetchedResultsController; 
_mfetchedResultsController.delegate = self; 

return _mfetchedResultsController; 

} 

Кроме того, я получаю это предупреждение в моей консоли, когда Tableview становится пустым с одним или двумя клетками LOG:

2015-06-19 09:58:43.259[17460:1401522] CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. *** -[_PFBatchFaultingArray objectAtIndex:]: index (0) beyond bounds (0) with userInfo (null) 
+0

Что такое «nsfetchedrequestcontroller»? – Mundi

ответ

0

Я думаю, что вы не создаете контекст правильно ваш выбранный контроллер результатов. Вы должны использовать API NSManagedObjectContextinitWithConcurrencyType и назначить родительский контроллер.

Кроме того, я думаю, что вы не должны создавать новый контекст каждый раз, когда вы создаете выбранный контроллер результатов. Вероятно, ваш конфликт делегатов вызван этим созвездием.

Контекст выбранных результатов должен быть в основном потоке, и у вас должен быть только один контекст основного потока, поэтому, возможно, было бы лучше иметь класс, обеспечивающий ваш основной стек данных (я вижу, что это делегат приложения) предоставить вам всегда один и тот же основной контекст.