                 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 {

extension FetchedResultsController {
    
    public func bindToTableView(tableView: UITableView, rowAnimation: UITableViewRowAnimation = .Fade, reloadRowAtIndexPath reloadRowAtIndexPathClosure: (NSIndexPath -> Void)? = nil) -> Self {
        var reloadData = false

        self
            .needsReloadData {
                reloadData = true
            }
            .willChangeContent { [unowned tableView] in
                if !reloadData {
                    tableView.beginUpdates()
                }
            }
            .didInsertSection { [unowned tableView] sectionInfo, sectionIndex in
                if !reloadData {
                    tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: rowAnimation)
                }
            }
            .didDeleteSection { [unowned tableView] sectionInfo, sectionIndex in
                if !reloadData {
                    tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: rowAnimation)
                }
            }
            .didUpdateSection { [unowned tableView] sectionInfo, sectionIndex in
                if !reloadData {
                    tableView.reloadSections(NSIndexSet(index: sectionIndex), withRowAnimation: rowAnimation)
                }
            }
            .didInsertEntity { [unowned tableView] entity, newIndexPath in
                if !reloadData {
                    tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: rowAnimation)
                }
            }
            .didDeleteEntity { [unowned tableView] entity, indexPath in
                if !reloadData {
                    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: rowAnimation)
                }
            }
            .didUpdateEntity { [unowned tableView] entity, indexPath in
                if !reloadData {
                    if let reloadRowAtIndexPathClosure = reloadRowAtIndexPathClosure {
                        reloadRowAtIndexPathClosure(indexPath)
                    }
                    else {
                        tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: rowAnimation)
                    }
                }
            }
            .didMoveEntity { [unowned tableView] entity, indexPath, newIndexPath in
                if !reloadData {
                    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: rowAnimation)
                    tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: rowAnimation)
                }
            }
            .didChangeContent { [unowned tableView] in

                            }
                    })
                }
            }
        
        return self
    }
