2

我使用此gist为FRC和UICollectionView。这工作得很好,直到iOS 9iOS 10:NSFetchedResultsController + UICollectionView,SIGABRT上performBatchUpdates

现在,iOS的10有时我的应用程序崩溃,在collectionviewperformBatchUpdates 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?什么是修复?

+0

对于那些想要弄清楚iOS 10中的错误的人,在使用库/照片/媒体时,您的应用可能会与SIGABORT崩溃。您需要在Info.plist中添加一些密钥,请检查[此链接。](http://stackoverflow.com/a/39631642/1223728) – Borzh

回答

1

做了一些研究后,找到了一个解决办法。我的应用程序从Web服务器获取数据并使用主线程插入它。

我认为这个信号因某种无效的数据操作而升高。由于我怀疑controllerDidChangeContent主线程),只要线程开始保存数据,委托就会被调用。 [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]; 
     } 
    }); 
} 
+0

谢谢您分享您的发现。我在iOS10和Swift 3中遇到了类似的问题。我已经花了三个星期的时间来试图发现正在发生的事情,并且我正在为此而疯狂。试过你的修补程序对我都不起作用。显然它与CoreData的变化有关。不过,我在后台上下文中做了所有更改。将所有CoreData操作移到主要上下文也没有帮助。也许它与CoreData Context版本控制有关。 – Lweek