2016-08-19 2 views
1

In meiner Chat-App ist "lastMessage" eine Beziehung zwischen den Entitäten Friend und messages. Jede Friend-Entität hat eine Reihe von Nachrichten und nur eine lastMessage. Wenn ich also eine Nachricht an die Rechnung sende, wird die "lastMessage" der Rechnung auf einen neueren Zeitstempel aktualisiert. Das heißt, abgerufeneResultsController-Objekte enthalten ein Array des lastMessage.timestamps jedes Freundes. Das Problem, das ich habe, ist mit dem UITableView. Wenn ich einem Freund eine Nachricht im chattingController übermittle und zurück drücke, während ich einfach "messageTable.reloadData" innerhalb von DidChangeContent habe, der Freund, den ich gemeldet habe, wird seine lastMessage auf den letzten Zeitstempel aktualisiert und als erster Eintrag in den fetchedResultsController sortiert. ihn auf den ersten Platz in der Tischansicht bringen. Da ich jedoch mithilfe von self.messagesTable.reloadRowsAtIndexPaths ([indexPath!], WithRowAnimation: UITableViewRowAnimation.None) innerhalb von didChangeObject Animationen hinzufügen möchte, wird nichts ordnungsgemäß neu geladen. Ich habe versucht, es einzulegen. Einfügen, .Update und .Move alle auf einmal. Ich bin ziemlich neu, NSFetchedResultsController zu einem TableView zu synchronisieren. Ich bin mir also nicht sicher, wie das erneute Laden einer Tabelle normalerweise mit NSFetchedResultsController durchgeführt wird.Synchronisierung von NSFetchedResultsController mit UITableView

@IBOutlet weak var messagesTable: UITableView! 

lazy var fetchedResultsController: NSFetchedResultsController = { 
    let fetchRequest = NSFetchRequest(entityName: "Friend") 
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "lastMessage.timestamp", ascending: false)] 
    let predicate = NSPredicate(format: "lastMessage.timestamp != nil") 
    fetchRequest.predicate = predicate 
    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 
    let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 
    frc.delegate = self 
    return frc 

}() 



func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 

    if type == .Insert { 

     self.messagesTable.reloadRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.None)//reloadItemsAtIndexPaths([indexPath!]) 
     self.messagesTable.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.None)//reloadItemsAtIndexPaths([indexPath!]) 


    } 

    if type == .Update{ 
     // self.collectionView?.cha([newIndexPath!]) 
     print("h") 
     self.messagesTable.reloadRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.None)//reloadItemsAtIndexPaths([indexPath!]) 
     self.messagesTable.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.None)//reloadItemsAtIndexPaths([indexPath!]) 


    } 

    if type == .Move{ 
     // self.collectionView?.cha([newIndexPath!]) 
     print("h") 
     self.messagesTable.reloadRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.None)//reloadItemsAtIndexPaths([indexPath!]) 
     self.messagesTable.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.None)//reloadItemsAtIndexPaths([indexPath!]) 


    } 

} 


func controllerDidChangeContent(controller: NSFetchedResultsController) { 

    self.messagesTable.beginUpdates() 


    } 

Antwort

1

Statt reloadRowsAtIndexPaths, verwenden Sie die insertRowsAtIndexPaths und deleteRowsAtIndexPaths Methoden. Verwenden Sie auch beginUpdates in der controllerWillChangeContent Methode und endUpdates in controllerDidChangeContent. Zum Beispiel:

func controllerWillChangeContent(controller: NSFetchedResultsController) { 
    self.messagesTable.beginUpdates() 
} 

func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) { 
    switch type { 
     case .Insert: 
      self.messagesTable.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade) 
     case .Delete: 
      self.messagesTable.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade) 
     default: 
      return 
    } 
} 

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 

    switch type { 
     case .Insert: 
      self.messagesTable.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade) 
     case .Delete: 
      self.messagesTable.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade) 
     case .Update: 
      self.messagesTable.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade) 
     case .Move: 
      self.messagesTable.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade) 
      self.messagesTable.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade) 
    } 
} 

func controllerDidChangeContent(controller: NSFetchedResultsController) { 
    self.messagesTable.endUpdates() 
} 
Verwandte Themen