【问题标题】:iOS 10: NSFetchedResultsController + UICollectionView, SIGABRT on performBatchUpdatesiOS 10:NSFetchedResultsController + UICollectionView,在 performBatchUpdates 上执行 SIGABRT
【发布时间】:2017-02-03 20:31:30
【问题描述】:

我将 gist 用于 FRC 和 UICollectionView。在 iOS 9 之前,这一切正常。

现在,在 iOS 10 中,有时我的应用会在 performBatchUpdatescollectionview 处出现 SIGABRT 信号崩溃而崩溃。即使CollectionView 从崩溃中逃脱,它也会以 1 或 2 个细胞陷入昏迷。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    // Checks if we should reload the collection view to fix a bug @ http://openradar.appspot.com/12954582
    if (self.shouldReloadCollectionView) {
        [self.collectionView reloadData];
    } else {
        [self.collectionView performBatchUpdates:^{ // CRASH : Thread 1: signal SIGABRT
            [self.blockOperation start];
        } completion:nil];
    }
}

这是因为UICollectionView 的新升级功能吗?解决方法是什么?

【问题讨论】:

  • 对于那些在 iOS 10 中努力找出错误的人来说,当使用库/照片/媒体时,您的应用程序可能会因 SIGABORT 而崩溃。你需要在Info.plist中添加一些key,检查this link.

标签: ios objective-c uicollectionview nsfetchedresultscontroller sigabrt


【解决方案1】:

经过一番研究,找到了解决此问题的方法。我的应用从网络服务器获取数据并使用主线程插入。

我假设由于某种无效的数据操作而引发了此信号。正如我怀疑 controllerDidChangeContent( ma​​in thread ) 委托在线程开始保存数据后立即被调用。 [self.managedObjectContext save:&savingError];

这种早期调用导致performBatchUpdates 在保存过程中沉迷于数据操作,从而导致崩溃。

controllerDidChangeContent 代码放入dispatch_async 修复了CollectionView 的崩溃和昏迷状态。我希望这对某人有所帮助。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    dispatch_async(dispatch_get_main_queue(), ^{
        // Checks if we should reload the collection view to fix a bug @ http://openradar.appspot.com/12954582
        if (self.shouldReloadCollectionView) {
            [self.collectionView reloadData];
        } else {
            [self.collectionView performBatchUpdates:^{ // No crash :)
                [self.blockOperation start];
            } completion:nil];
        }
    }); 
}

【讨论】:

  • 感谢您分享您的发现。我在 iOS10 和 Swift 3 中遇到了类似的问题。我已经花了三周的时间试图发现发生了什么,我正为此发疯。试过你的修复对我也不起作用。显然它与CoreData的变化有关。但是我在背景上下文中进行了所有更改。将所有 CoreData 操作移至主上下文也无济于事。也许它与 CoreData 上下文版本控制有关。
猜你喜欢
  • 2012-09-21
  • 2023-03-21
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多