推送后保存objectAtIndex时NSFetchedResultsController崩溃

时间:2013-12-05 07:53:17

标签: ios iphone objective-c nsfetchedresultscontroller

我的应用中有两个UIViewControllers(与此问题相关)。

每个人都有一个NSFetchedResultsController,其中entity的请求名为News。它们都具有相同的排序描述符,并且它们使用相同的UITableViewCell子类来显示所有内容。它们也符合NSFetchedResultsControllerDelegate并运行委托方法。

唯一的区别是第一个视图控制器,我将其称为SummaryVC,仅显示获取的第一个(最多)6个对象。而另一个,NewsFeedVC显示所有对象,并且它还会下载更多对象。因此,SummaryVC中的委托方法只运行[self.tableView reloadData];

首次启动应用时,会显示SummaryVC并触发下载前6个News个对象(从JSON转换)并将其保存在BG线程中。

FRC然后选择保存并显示实体。

然而...

在应用程序的不同部分之间推送和弹出后,间歇性地(我讨厌这个词)。我回到SummaryVC,应用程序将崩溃。

它也总是一样的崩溃。

CoreData: error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  *** -[_PFArray objectAtIndex:]: index (46) beyond bounds (6) with userInfo (null)
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFArray objectAtIndex:]: index (46) beyond bounds (6)'

在这种情况下,已经有超过6个实体加载到Core Data中。 6让我怀疑属于FRC的{​​{1}}。

我已经尝试了几件事来解决这个问题。

  1. SummaryVC上将FRC委托设为nil。
  2. viewWillDisappear设置为FRC上的nil。
  3. 当委托方法调用时,检查viewWillDisappear实际上是屏幕上的VC
  4. VC NewsFeedVC中,它现在取消其队列中的所有下载操作。
  5. 问题似乎是viewWillDisappearsaveContext选中的结果。即如果我进入FRC并触发下载,然后在VC完成之前弹出VC,那么这似乎会触发崩溃。

    现在,代码明智。崩溃永远不会出现在我自己的代码中。

    我可以显示NewsFeedVC设置...

    FRC

    我想也许我应该将FRC从一个物体传递到另一个物体。即将它注入一个属性,这样只有一个属性。这是有效的吗?

    修改

    是否可以为goths获取的结果控制器使用相同的缓存名称呢?

    EDIT2

    不,如果我更改缓存名称,它仍然会崩溃。

    EDIT3

    好的,我每次都可以复制这个。如果我开始- (NSFetchedResultsController *)fetchedResultsController { if (!_fetchedResultsController) { NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"News"]; NSSortDescriptor *dateSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]; NSSortDescriptor *sourceSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"source" ascending:YES]; NSSortDescriptor *titleSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]; fetchRequest.sortDescriptors = @[dateSortDescriptor, sourceSortDescriptor, titleSortDescriptor]; _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.moc sectionNameKeyPath:nil cacheName:@"AllNewsItems"]; _fetchedResultsController.delegate = self; NSError *error = nil; [_fetchedResultsController performFetch:&error]; if (error) { NSLog(@"Error performing fetch: %@, %@", error, [error userInfo]); } } return _fetchedResultsController; } 滚动,然后在滚动时我会弹回NewsFeedVC

1 个答案:

答案 0 :(得分:2)

感谢Martin R的解决方案。

我从FetchedResultsController的初始化中删除了cacheName并修复了问题。

感谢。