2016-08-19 4 views
1

В моем приложении чата «lastMessage» - это связь между объектами Friend и сообщениями. У каждого друга есть набор сообщений и только одно последнее сообщение. Поэтому, если я отправлю сообщение на счет, «lastMessage» счета будет обновлен до более новой отметки времени. Тем не менее, извлеченные объекты fetchedResultsController содержат массив данных lastMessage.timestamp каждого друга. Проблема, с которой я столкнулась, связана с UITableView. Если я сообщу другу сообщение в chattingController и вернусь, просто имея «messageTable.reloadData» внутри DidChangeContent, друга, которого я послал, его последнее сообщение обновляется до последней отметки времени и сортируется как первая запись в файле fetchedResultsController, перемещая его в первое место в таблице. Однако, поскольку я хочу добавить анимацию, используя self.messagesTable.reloadRowsAtIndexPaths ([indexPath!], WithRowAnimation: UITableViewRowAnimation.None) внутри doChangeObject, ничто не перезагружается должным образом. Я попытался вставить его .Insert, .Update и .Move все сразу. Я довольно новичок в синхронизации NSFetchedResultsController с tableView. Поэтому я не уверен, как обычно выполняется перезагрузка таблицы с помощью NSFetchedResultsController.Синхронизация NSFetchedResultsController с 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() 


    } 

ответ

1

Вместо reloadRowsAtIndexPaths, использовать insertRowsAtIndexPaths и deleteRowsAtIndexPaths методы. Также используйте beginUpdates в методе controllerWillChangeContent и endUpdates в controllerDidChangeContent. Например:

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() 
} 
Смежные вопросы