         guard let chat = fetchedResultsController?.objectAtIndexPath(indexPath) as? Chat else { return }
     }
 }
-
-
-extension AllChatsViewController: NSFetchedResultsControllerDelegate {
-    
-    // MARK: NSFetchedResultsControllerDelegate Methods
-    
-    func controllerWillChangeContent(controller: NSFetchedResultsController) {
-        // start to expect changes to occur
-        tableView.beginUpdates()
-    }
-    
-    
-    func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
-        
-        // switch on the type of change
-        switch type {
-            
-            // for inserts call the tableView insert sections method
-        case .Insert:
-            tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade)
-            
-            // for deletes call the tabelView delete sections method
-        case .Delete:
-            tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade)
-            
-            // otherwise break
-        default:
-            break
-        }
-    }
-    
-    
-    func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
-        
-        // switch on type of change
-        switch type {
-            
-            // for inserts call tableview insert rows at index path
-        case .Insert:
-            tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
-            
-            // for updates - get the cell, update it, and reload the tableView
-        case .Update:
-            let cell = tableView.cellForRowAtIndexPath(indexPath!)
-            configureCell(cell!, atIndexPath: indexPath!)
-            tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
-            
-            // for moves - delete the cell from its original indexPath and add it to its new indexPath
-        case .Move:
-            tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
-            tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
-            
-            // for deletes call the tableView delete rows at index path method
-        case .Delete:
-            tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
-        }
-    }
-    
-    
-    func controllerDidChangeContent(controller: NSFetchedResultsController) {
-        
-        // once the contents changed let the tableView know to end updates
-        tableView.endUpdates()
-    }
-}

            // set up fetched results controller with the initializer using the request and context
            fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: contextExists, sectionNameKeyPath: nil, cacheName: nil)
            
            // set ourselves up as the delegate of the fetched results controller
            fetchedResultsController?.delegate = self
            
            // attempt a fetch
            do {

import UIKit
import CoreData

class AllChatsViewController: UIViewController, TableViewFetchedResultsDisplayer {

    var context: NSManagedObjectContext?
    private var fetchedResultsController: NSFetchedResultsController?
    
    private let tableView = UITableView(frame: CGRectZero, style: .Plain)
    private let cellIdentifier = "MessageCell"
    
    private var fetchedResultsDelegate: NSFetchedResultsControllerDelegate?
    
    
    // MARK: View Lifecycle
