首页 文章

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

提问于
浏览
3

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

NSFetchedResultsController delegate fired even when context not saved

这样做之后,我没有得到空白单元格,但是tableview不会自动更新 . 如何自动更新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)

1 回答

  • 0

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

    此外,我认为每次创建提取的结果控制器时都不应创建新的上下文 . 您的代表崩溃可能是由这个星座引起的 .

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

相关问题