使用 nsfetchedresultscontroller 时,未在 uitableview 中自动重新加载数据

Posted

技术标签:

【中文标题】使用 nsfetchedresultscontroller 时,未在 uitableview 中自动重新加载数据【英文标题】:Data not reloading automatically in uitableview when using nsfetchedresultscontroller 【发布时间】:2015-06-19 05:13:09 【问题描述】:

在我的应用程序中,数据在后台存储到核心数据中。主 managedobjectcontext(在 appdelegate 中)通过通知方法通知每个后台保存。我在表格视图中显示数据。我使用 nsfetchedrequestcontroller 自动更新 tableview。我在 fetchedresultscontroller 的 appdelegate 中使用了相同的 managedobjectcontext。我按预期获得了数据,并且每次在后台保存数据时都会更新表格视图。但有时表格视图会变得空白,只有一两个单元格。我在谷歌上搜索了很多关于这个问题的信息,发现正在呈现故障数据。因此,我将 fetchedresultscontroller 的 managedobjectcontext 更改为新的 managedobjectcontext,如下面的链接所述。

NSFetchedResultsController delegate fired even when context not saved

这样做后,我没有得到空白单元格,但表格视图不会自动更新。如何自动更新表格视图?

-(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 只有一两个单元格变为空白时,我的控制台中也会收到此警告 日志:

 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)

【问题讨论】:

什么是“nsfetchedrequestcontroller”? 【参考方案1】:

我认为您没有在获取的结果控制器中正确创建上下文。您应该使用NSManagedObjectContext API initWithConcurrencyType 并分配一个父控制器。

另外,我认为您不应该在每次创建获取的结果控制器时都创建新的上下文。您的委托崩溃很可能是由这个星座引起的。

获取的结果控制器的上下文应该在主线程上,并且你应该只有一个主线程上下文,所以也许最好让类提供你的核心数据堆栈(我看到它是应用程序委托)提供你总是有相同的主要背景。

【讨论】:

以上是关于使用 nsfetchedresultscontroller 时,未在 uitableview 中自动重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存竞争条件错误

在 Swift 3 中难以配置 NSFetchedResultsController

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?