Swift 3 中的 UICollectionView + NSFetchedResultsController
Posted
技术标签:
【中文标题】Swift 3 中的 UICollectionView + NSFetchedResultsController【英文标题】:UICollectionView + NSFetchedResultsController in Swift 3 【发布时间】:2016-10-13 14:43:24 【问题描述】:在我当前的项目中,我将NSFetchedResultsController
与UICollectionView
集成在一起,效果很好。目前我尝试将项目升级到 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 3
和ios10
。因为它没有解决从后台线程更新UICollectionView
的问题。
错误是由后台线程更新UICollectionView
引起的。
This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread.
要使NSFetchedResultsController
和UICollectionView
的组合正常工作,您必须将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”