В моем приложении чата «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()
}