1

Ich habe Core Data-Datenbank. Struktur auf dem Bild ist (DBContact viele DBMessages haben mit Eigentum messages, die jeweils DBMessage haben einen Kontakt mit Immobilien contact):NSFetchedResultsController mit Tabelle wie iMessage

enter image description here

Ich möchte durch den Kontakt und sortiert nach Datum gruppiert Nachrichten anzuzeigen. Die Anzahl der Zeilen muss also = Anzahl der Kontakte mit Nachrichten sein. Und in jeder Zeile muss ich den Avatar, den Namen und den Namen des Kontakts sowie den Text und das Datum der letzten Nachricht dieses Kontakts anzeigen.

Die einzige Lösung, die ich gefunden ist:

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 
    } 

aber in diesem Fall Kontakte werden durch ID sortiert werden, aber ich brauche sie nach dem Datum der letzten Nachricht zu sortieren. Aber wenn ich sortDescriptors in fetchRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false), NSSortDescriptor(key: "contact.id", ascending: false)] ändere, um zuerst nach Datum zu sortieren, werden die Kontakte nicht korrekt angezeigt. Hat jemand Ideen, wie man das umsetzt?

Antwort

1

Ich würde wahrscheinlich das Modell ändern, um das Leben einfacher zu machen und ein wenig mehr Verarbeitung früher zu machen. Grundsätzlich, wenn eine weitere Beziehung, 1 zu 1, zwischen den 2 Entitäten hinzufügen und jedes Mal, wenn eine neue Nachricht hinzugefügt wird, aktualisieren Sie diese Beziehung - so haben Sie immer einen direkten Zeiger auf die neueste Nachricht.

Sobald Sie getan haben, dass Ihre FRC und Ihre Tabelle laden Geschwindigkeit sind trivial, weil Sie nur Kontakte im Fetch verwenden. Neue Nachrichten werden ebenfalls korrekt behandelt, da die Beziehung aktualisiert wird, sodass sich der Kontakt ändert und der FRC es anzeigt.

+0

vielen Dank –

+0

aber ich brauche Filter nach Datum und Art der Bestellung, so wird diese Implementierung nicht funktionieren. Kannst du einen anderen Ratschlag geben? –

+0

Was meinst du Art der Bestellung? Sie können weiterhin ein Prädikat anwenden, das das Datum verwendet. – Wain