2016-04-11 58 views
1

NSFetchedResultsController ile ilgili bir sorunum vardı. BennsfetchedResultsController - veri birleştirilirken hata oluştu

extension ComplimentsViewController: NSFetchedResultsControllerDelegate { 
    func controllerWillChangeContent(controller: NSFetchedResultsController) { 
     dispatch_async(dispatch_get_main_queue(), { 
      self.tableView.beginUpdates() 
     }) 
    } 

    func controllerDidChangeContent(controller: NSFetchedResultsController) { 
     dispatch_async(dispatch_get_main_queue(), { 
      self.tableView.endUpdates() 
     }) 

    } 
    func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 
     switch (type) { 
     case .Insert: 
      if let indexPath = newIndexPath { 
       tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
      } 
      break; 
     case .Delete: 
      if let indexPath = indexPath { 
       tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
      } 
      break; 
     case .Update: 
      if let indexPath = indexPath { 
       tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 
      } 
      break; 
     case .Move: 
      if let indexPath = indexPath { 
       tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
      } 

      if let newIndexPath = newIndexPath { 
       tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade) 
      } 
      break; 
     } 
    } 
ile

func performFetch() { 
    fetchedResultsController.managedObjectContext.performBlock { [weak self] in 
     do { 
      try self!.fetchedResultsController.performFetch() 
     } catch { 
      let fetchError = error as NSError 
      print("\(fetchError), \(fetchError.userInfo)") 
     } 
     dispatch_async(dispatch_get_main_queue(), { 
      self!.tableView.reloadData() 
     }) 
    } 

arıyorum

viewDidLoad yılında
lazy var fetchedResultsController: NSFetchedResultsController = { 
    let fetchedResultsController = InboxFetchResultsController() 
    fetchedResultsController.delegate = self 
    fetchedResultsController.fetchRequest.predicate = self.receivedPredicate 
    return fetchedResultsController 
}() 

Ben

class InboxFetchResultsController: NSFetchedResultsController { 

    override init() { 
     let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

     let fetchRequest = NSFetchRequest(entityName: "Compliment") 

     let firstSortDescriptor = NSSortDescriptor(key: "updatedAt", ascending: false) 
     let secondSortDescriptor = NSSortDescriptor(key: "sendedDate", ascending: false) 
     fetchRequest.sortDescriptors = [firstSortDescriptor, secondSortDescriptor] 
     let privateManagedObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 
     privateManagedObjectContext.parentContext = appDelegate.cdh.managedObjectContext 
     let user = try! privateManagedObjectContext.existingObjectWithID(CoreDataManager.sharedInstance.getLoggedUser().objectID) as! User 

     let predicate = NSPredicate(format: "recievedBelong = %@", user) 

     fetchRequest.predicate = predicate 

     super.init(fetchRequest: fetchRequest, managedObjectContext: privateManagedObjectContext, sectionNameKeyPath: nil, cacheName: nil) 
// 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(contextDidSaveContext(_:)), name: NSManagedObjectContextDidSaveNotification, object: nil) 
    } 


    deinit{ 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    func contextDidSaveContext(notification: NSNotification) { 
     let sender = notification.object as! NSManagedObjectContext 
     if sender != managedObjectContext { 
      self.managedObjectContext.performBlock({ [weak self] in 
       DDLogInfo("Core data merging") 
       self!.managedObjectContext.mergeChangesFromContextDidSaveNotification(notification) 
      }) 

     } 
    } 

} 

Ve ComplimentsViewController ile FRC

alt sınıf vardı

Arka plan Bağlamında ayrılmış olan ViewModel'i kullanarak farklı Görünüm Denetleyicisi'nde getirilen nesneyi düzenliyorum. Ben ... tableView temsilci yöntemleri kontrol Ve hala bu sorunu olsun, eşzamanlılık hakkında saat özen saatlerce

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).' 
*** First throw call stack: 

: Ben arka plan bağlamı kaydettiğinizde , o hata alıyorum. Aradığınızda olmamalı böylece NSFetchedResultsController kullandığınız

+0

söz sürece kırmaktır sizin switch yılında break; için, Swift içinde noktalı virgül gerekmez ?! Alt sınıfınızda yaptığınız hiçbir şey bir alt sınıf gerektirir. Sadece bir NSFRC örneği oluşturun. Alt sınıfı yapma. – Fogmeister

cevap

0

:

 


    dispatch_async(dispatch_get_main_queue(), { 
     self!.tableView.reloadData() 
    }) 

 

tüm NSFetchedResultsControllerDelegate yöntemiyle beri tableView güncellemek için buradayız, otomatik olarak tetiklenir.

Ayrıca ne varsayılan davranış açıkça Neden NSFRC sınıflara olan fallthrough

İlgili konular