                 insertedItemIndexPaths.removeAll(keepCapacity: false)
                 deletedItemIndexPaths.removeAll(keepCapacity: false)
                 updatedItemIndexPaths.removeAll(keepCapacity: false)
+                
+                reloadData = false
+            }
+        
+        return self
+    }
+
+    public func bindToCollectionView(collectionView: UICollectionView, reloadItemAtIndexPath reloadItemAtIndexPathClosure: (NSIndexPath -> Void)? = nil) -> Self {
+        var insertedSectionIndexes = NSMutableIndexSet()
+        var deletedSectionIndexes = NSMutableIndexSet()
+        var updatedSectionIndexes = NSMutableIndexSet()
+        
+        var insertedItemIndexPaths = [NSIndexPath]()
+        var deletedItemIndexPaths = [NSIndexPath]()
+        var updatedItemIndexPaths = [NSIndexPath]()
+        
+        var reloadData = false
+        
+        self
+            .needsReloadData {
+                reloadData = true
+            }
+            .willChangeContent {
+                if !reloadData {
+                    insertedSectionIndexes.removeAllIndexes()
+                    deletedSectionIndexes.removeAllIndexes()
+                    updatedSectionIndexes.removeAllIndexes()
+                    
+                    insertedItemIndexPaths.removeAll(keepCapacity: false)
+                    deletedItemIndexPaths.removeAll(keepCapacity: false)
+                    updatedItemIndexPaths.removeAll(keepCapacity: false)
+                }
             }
             .didInsertSection { sectionInfo, sectionIndex in
                 if !reloadData {

            }
            .didInsertEntity { entity, newIndexPath in
                if !reloadData {
                    insertedItemIndexPaths.append(newIndexPath)
                }
            }
            .didDeleteEntity { entity, indexPath in
                if !reloadData {
                    deletedItemIndexPaths.append(indexPath)
                }
            }
            .didUpdateEntity { entity, indexPath in
                if !reloadData {
                    updatedItemIndexPaths.append(indexPath)
                }
            }
            .didMoveEntity { entity, indexPath, newIndexPath in
                reloadData = true
            }
            .didChangeContent { [unowned collectionView] in
                if reloadData {

extension FetchedResultsController {
    
    public func bindToTableView(tableView: UITableView, rowAnimation: UITableViewRowAnimation = .Fade, reloadRowAtIndexPath reloadRowAtIndexPathClosure: (NSIndexPath -> Void)? = nil) -> Self {
        var insertedSectionIndexes = NSMutableIndexSet()
        var deletedSectionIndexes = NSMutableIndexSet()
        var updatedSectionIndexes = NSMutableIndexSet()
        
        var insertedItemIndexPaths = [NSIndexPath]()
        var deletedItemIndexPaths = [NSIndexPath]()
        var updatedItemIndexPaths = [NSIndexPath]()
        
        var reloadData = false
        
        self
            .needsReloadData {
                reloadData = true
            }
            .willChangeContent {
                if !reloadData {
                    insertedSectionIndexes.removeAllIndexes()
                    deletedSectionIndexes.removeAllIndexes()
                    updatedSectionIndexes.removeAllIndexes()
                    
                    insertedItemIndexPaths.removeAll(keepCapacity: false)
                    deletedItemIndexPaths.removeAll(keepCapacity: false)
                    updatedItemIndexPaths.removeAll(keepCapacity: false)

                    //
                    tableView.beginUpdates()
                }
            }
            .didInsertSection { sectionInfo, sectionIndex in
                if !reloadData {
                    insertedSectionIndexes.addIndex(sectionIndex)
                }
            }
            .didDeleteSection { sectionInfo, sectionIndex in
                if !reloadData {
                    deletedSectionIndexes.addIndex(sectionIndex)
                    deletedItemIndexPaths = deletedItemIndexPaths.filter { $0.section != sectionIndex }
                    updatedItemIndexPaths = updatedItemIndexPaths.filter { $0.section != sectionIndex }
                }
            }
            .didUpdateSection { sectionInfo, sectionIndex in
                if !reloadData {
                    updatedSectionIndexes.addIndex(sectionIndex)
                }
            }
            .didInsertEntity { entity, newIndexPath in
                if !reloadData {
                    if !insertedSectionIndexes.containsIndex(newIndexPath.section) {
                        insertedItemIndexPaths.append(newIndexPath)
                    }
                }
            }
            .didDeleteEntity { entity, indexPath in
                if !reloadData {
                    if !deletedSectionIndexes.containsIndex(indexPath.section) {
                        deletedItemIndexPaths.append(indexPath)
                    }
                }
            }
            .didUpdateEntity { entity, indexPath in
                if !reloadData {
                    if !deletedSectionIndexes.containsIndex(indexPath.section) && find(deletedItemIndexPaths, indexPath) == nil && find(updatedItemIndexPaths, indexPath) == nil {
                        updatedItemIndexPaths.append(indexPath)
                    }
                }
            }
            .didMoveEntity { entity, indexPath, newIndexPath in
                if !reloadData {
                    if !deletedSectionIndexes.containsIndex(indexPath.section) {
                        deletedItemIndexPaths.append(indexPath)
                    }
                    
                    if !insertedSectionIndexes.containsIndex(newIndexPath.section) {
                        insertedItemIndexPaths.append(newIndexPath)
                    }
                }
            }
            .didChangeContent { [unowned tableView] in
