gpt4 book ai didi

ios - 推送后保存 objectAtIndex 时 NSFetchedResultsController 崩溃

转载 作者:可可西里 更新时间:2023-11-01 05:54:53 28 4
gpt4 key购买 nike

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

他们每个人都有一个 NSFetchedResultsController,对同一个名为 Newsentity 发出请求。它们也有相同的排序描述符,并且使用相同的 UITableViewCell 子类来显示所有内容。它们也都符合 NSFetchedResultsControllerDelegate 并运行委托(delegate)方法。

唯一的区别是第一个 View Controller ,我将其称为 SummaryVC,只显示第一个(最多)6 个获取的对象。而另一个 NewsFeedVC 显示了所有对象,它还会对更多对象的下载进行分页。因此 SummaryVC 中的委托(delegate)方法只运行 [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 让我怀疑属于 SummaryVCFRC

我已经尝试了几种方法来解决这个问题。

  1. viewWillDisappear 上将 FRC 委托(delegate)设置为 nil。
  2. viewWillDisappear 上将 FRC 设置为 nil。
  3. 当调用委托(delegate)方法时,检查 VC 实际上是屏幕上的 VC
  4. NewsFeedVC viewWillDisappear 中,它现在取消了队列中的所有下载操作。

问题似乎是 saveContextFRC 获取的结果。即,如果我进入 NewsFeedVC 并触发下载,然后在它完成之前弹出 VC,那么这似乎会触发崩溃。

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

我可以显示FRC设置...

- (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;
}

我在想也许我应该将 FRC 从一个对象传递到另一个对象。 IE。将它注入(inject)一个属性,以便只有一个。这是正确的做法吗?

编辑

这可能与哥特式获取结果 Controller 使用相同的缓存名称有关吗?

EDIT2

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

EDIT3

好的,我每次都可以复制这个。如果我启动 NewsFeedVC 滚动,然后在滚动时我弹回 ​​SummaryVC,就会发生这种情况。

最佳答案

感谢 Martin R 的修复。

我从 FetchedResultsController 的初始化中删除了 cacheName,它解决了这个问题。

谢谢。

关于ios - 推送后保存 objectAtIndex 时 NSFetchedResultsController 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20394372/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com