UICollectionView NSFetchedResultsController в Swift 3

#swift #uicollectionview #swift3 #nsfetchedresultscontroller

#swift #uicollectionview #swift3 #nsfetchedresultscontroller

Вопрос:

В моем текущем проекте я интегрировал a NSFetchedResultsController с a 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)
    })
}
  

Кто-нибудь, реализованный NSFetchedResultsController с помощью a UICollectionView в Swift 3, может помочь мне в этом?

Комментарии:

1. эй, может быть, это поможет? — gist.github.com/nazywamsiepawel /…

Ответ №1:

Спасибо, Павел, твоя суть была очень полезной. Я разветвил его и обновил, чтобы полностью поддерживать 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!])
}
  

Вот ссылка на полную обновленную суть