1

私の現在のプロジェクトでは、とUICollectionViewがうまく動作しました。現在、私は私がUICollectionViewへの変更をキューするBlockOperation配列を使用しています、次のエラーメッセージSwiftのUICollectionView + NSFetchedResultsController 3

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

を引き起こしスウィフト3とXcode 8にプロジェクトをアップグレードしよう。ここでは、新しいアイテムを挿入する方法の例を示します。

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) 
    }) 
} 

の私の現在の実装では、誰もこれで私を助けることができるスウィフト3でUICollectionViewNSFetchedResultsControllerを実施しているのですか?

+1

へのリンクは多分という、ちょっとです役立ちます? - https://gist.github.com/nazywamsiepawel/e88790a1af1935ff5791c9fe2ea19675 –

答えて

4

ありがとうPawel、あなたのGistは非常に役に立ちました。私はそれをフォークし、完全にSwift 3iOS10をサポートするように更新しました。バックグラウンドスレッドからUICollectionViewを更新しても問題は解決しないためです。

エラーは、UICollectionViewをバックグラウンドスレッドから更新することによって発生します。あなたがここに

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

collectionViewオブジェクトのすべての更新をラップする必要が働いNSFetchedResultsControllerUICollectionViewの組み合わせを取得するには

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

はフル更新Gist

関連する問題