1

У меня есть база данных Core Data. Структура находится на изображении (DBContact много DBMessages с имуществом messages, каждый DBMessage есть один контакт со свойством contact):NSFetchedResultsController с таблицей, подобной iMessage

enter image description here

Я хочу для отображения сообщений, сгруппированных по контакту и упорядоченные по дате. Таким образом, количество строк должно быть = количество контактов с сообщениями. И в каждой строке я должен отображать аватар, имяAndSurname контакта и текст и дату последнего сообщения этого контакта.

Единственное решение, которое я нашел это:

let entityName = kDBOrder 
     let entityDescription = NSEntityDescription.entityForName(entityName, inManagedObjectContext: managedObjectContext) 
     let fetchRequest = NSFetchRequest() 
     fetchRequest.entity = entityDescription 
     fetchRequest.fetchBatchSize = 20 
     // sort 
     fetchRequest.sortDescriptors = [NSSortDescriptor(key: "contact.id", ascending: false), NSSortDescriptor(key: "date", ascending: false)] 
     let sectionNameKeyPath: String? = "contact.id" 
     self.fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: sectionNameKeyPath, cacheName: nil) 
     fetchedResultsController!.delegate = self 
     if tableViewMain != nil { 
      do { 
      try fetchedResultsController!.performFetch() 
      } catch { 
      print("An error occurred in fetchresultcontroller") 
      } 
      tableViewMain.reloadData() 
     } 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     var count = 0 
     if let sections = fetchedResultsController?.sections { 
      let currentSection = sections[section] 
      count = currentSection.numberOfObjects 
      // in each section we must have only 1 row 
      if count > 0 { 
       count = 1 
      } 
     } 
     return count 
    } 

Но в этом случае контакты будут отсортированы по идентификатору, но мне нужно, чтобы отсортировать их по дате последнего сообщения. Но если я изменил sortDescriptors на fetchRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false), NSSortDescriptor(key: "contact.id", ascending: false)], чтобы отсортировать по дате сначала, он не отобразит контакты должным образом. У кого-нибудь есть идеи, как это реализовать?

ответ

1

Я бы, вероятно, сменил модель, чтобы облегчить жизнь и сделать немного больше обработки раньше. В основном, если добавить другое отношение, 1 к 1, между двумя сущностями и каждый раз, когда добавляется новое сообщение, обновляется это отношение - поэтому у вас всегда есть прямой указатель на самое последнее сообщение.

После того, как вы сделали это, FRC и скорость загрузки вашего стола тривиальны, потому что вы просто используете контакты в выборке. Новые сообщения также обрабатываются правильно, потому что отношения обновляются, поэтому контакт меняется, и FRC увидит его.

+0

спасибо большое –

+0

, но мне нужно иметь фильтр по дате и типу заказа, поэтому эта реализация не будет работать. Можете ли вы посоветоваться? –

+0

Что значит тип заказа? Вы можете применить предикат, который использует дату. – Wain