Swift 3 中的 UICollectionView + NSFetchedResultsController

Posted

技术标签:

【中文标题】Swift 3 中的 UICollectionView + NSFetchedResultsController【英文标题】:UICollectionView + NSFetchedResultsController in Swift 3 【发布时间】:2016-10-13 14:43:24 【问题描述】:

在我当前的项目中,我将NSFetchedResultsControllerUICollectionView 集成在一起,效果很好。目前我尝试将项目升级到 Swift 3 和 Xcode 8,这会导致以下错误消息

This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread.

我正在使用BlockOperation 数组将更改排队到UICollectionView。这是我如何插入新项目的示例。

self.blockOperations.append(BlockOperation(block: 
   collectionView?.insertItems( at: [newIndexPath!])
))

这是我当前对controllerDidChangeContent的实现

var blockOperations = [BlockOperation]()

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) 
    if self.shouldReloadCollectionView 
        self.collectionView.reloadData()
    
    self.collectionView?.performBatchUpdates(    
        for operation in self.blockOperations 
            OperationQueue.current?.addOperation(operation)
        
        , completion:  (completed) in
            print(completed)
    )

有没有人在 Swift 3 中使用 UICollectionView 实现 NSFetchedResultsController 并且可以帮助我解决这个问题?

【问题讨论】:

嘿,也许这会有所帮助? - gist.github.com/nazywamsiepawel/… 【参考方案1】:

感谢 Pawel,您的 Gist 非常有帮助。我将它分叉并更新为完全支持Swift 3ios10。因为它没有解决从后台线程更新UICollectionView 的问题。

错误是由后台线程更新UICollectionView引起的。

This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread.

要使NSFetchedResultsControllerUICollectionView 的组合正常工作,您必须将collectionView 对象的每次更新都包含在其中

DispatchQueue.main.async 
    // i.e. insertion of new items                          
    this.collectionView!.insertItems(at: [newIndexPath!])

这里是完整更新的Gist的链接

【讨论】:

以上是关于Swift 3 中的 UICollectionView + NSFetchedResultsController的主要内容,如果未能解决你的问题,请参考以下文章

ios 8.1:类型“ViewController”不符合协议“UICollectionViewDataSource”

UITableViewCell 中的 UICollectionView?

淡出 UICollectionView 中的项目

swift Swift 3中的UserSettings

swift swift中的错误处理3

swift Swift 3.0中的测量和单位示例