     open override func viewDidLoad() {
         super.viewDidLoad()
         
-        registerCells()
-    }
-    
-    // MARK: Abstract
-    
-    open func cell(forIdentifier identifier: String) -> CollectionCell {
-        return .empty
-    }
-    
-    open func update(_ cell: UICollectionViewCell & CollectionViewModelCell, at indexPath: IndexPath) {
-        let item = dataSource.item(at: indexPath)
-        cell.update(with: item)
+        reload()
     }
     
     // MARK: Helpers
     
     private func reload() {
         if Thread.isMainThread {
-            registerCellsAndReloadDataIfNeeded()
+            registerCells()
+            collectionView?.reloadData()
         } else {
             DispatchQueue.main.async { [weak self] in
-                self?.registerCellsAndReloadDataIfNeeded()
+                self?.registerCells()
+                self?.collectionView?.reloadData()
             }
         }
-    }
-    
-    private func registerCellsAndReloadDataIfNeeded() {
-        registerCells()
-        collectionView?.reloadData()
     }
     
     private func registerCells() {

        let identifier = dataSource.identifier(at: indexPath)
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath)
        if let cell = cell as? UICollectionViewCell & CollectionViewModelCell {
            update(cell, at: indexPath)
        }
        return cell
    }


import UIKit

public protocol CollectionViewModelControllerDelegate: class {
    func cell(forIdentifier identifier: String) -> CollectionCell
    func update(_ cell: UICollectionViewCell & CollectionViewModelCell, at indexPath: IndexPath)
}

public extension CollectionViewModelControllerDelegate where Self: CollectionViewModelController {
    func cell(forIdentifier identifier: String) -> CollectionCell {
        return .empty
    }
    func update(_ cell: UICollectionViewCell & CollectionViewModelCell, at indexPath: IndexPath) {
        let item = dataSource.item(at: indexPath)
        cell.update(with: item)
    }
}

open class CollectionViewModelController: UICollectionViewController {
    
    // MARK: Properties

    public weak var delegate: CollectionViewModelControllerDelegate?

    open var isAutomaticReloadEnabled = true

