Ich mache eine Chat-App, wo ich Chat-Zeit für jeden Chat speichern, jetzt muss ich die neuesten Chats zuerst anzeigen, gruppiert in Abschnitt, für zB: Wenn ich 10 Chats von heute habe Es sollte unter Abschnitt namens 10. Juli 2016 mit zuletzt senden Chat zuletzt sein. Dazu sortiere ich die Liste nach chatTimestamp und habe ein weiteres sectionDate-Feld, das das entsprechende Datum speichert. Unten sehen Sie ein Beispielformat für Daten, die in den Kerndaten angezeigt werden.Sortierung Sektionen Problem in NSFetchedResultsController
<MyChat.ChatData: 0x7f8b71cdd190> (entity: ChatData; id: 0xd000000000140002 <x-coredata:….> ; data: {
chatDeviceType = ipad;
chatId = 3557;
chatOwnerName = “John Mathew”;
chatReadStatus = 1;
chatStatus = Received;
chatText = “Hi how are you?“;
chatTimestamp = "2015-09-21 10:41:37 +0000";
chatType = Mine;
imageData = nil;
imageUrl = nil;
sectionDate = "Sep 21, 2015";
users = "0xd000000000080000 <x-coredata:…>”;
})
Dies ist ein Teil meines Codes so weit
var fetchedResultsController: NSFetchedResultsController = NSFetchedResultsController()
override func viewDidLoad() {
super.viewDidLoad()
setupFRC(limit: LIMIT)
......
}
func setupFRC(limit limit:Int) {
messageMaxLimit += limit
let objectsCount = self.stack.mainContext.countForFetchRequest(fetchRequest(self.stack.mainContext), error: nil)
NSFetchedResultsController.deleteCacheWithName("Root")
let request = self.fetchRequest(self.stack.mainContext)
self.fetchedResultsController = NSFetchedResultsController(fetchRequest: request,
managedObjectContext: self.stack.mainContext,
sectionNameKeyPath: "sectionDate",
cacheName: "Root")
self.fetchedResultsController.delegate = self
self.messageMaxLimit = self.messageMaxLimit > objectsCount ? objectsCount : self.messageMaxLimit
if objectsCount > self.messageMaxLimit
{
self.fetchedResultsController.fetchRequest.fetchOffset = objectsCount - self.messageMaxLimit
}
self.fetchData()
}
//To fetch data in FRC
func fetchData() {
do {
try self.fetchedResultsController.performFetch()
chatCollectionView.reloadData()
} catch {
assertionFailure("Failed to fetch: \(error)")
}
}
func fetchRequest(context: NSManagedObjectContext) -> FetchRequest<ChatData> {
let e = entity(name: "ChatData", context: context)
let fetch = FetchRequest<ChatData>(entity: e)
fetch.predicate = NSPredicate(format: "(SELF.users == %@)", currentUser!)
//Sort by chatTimeStamp
let sortDescriptor = NSSortDescriptor(key: "chatTimestamp", ascending: true)
fetch.sortDescriptors = [sortDescriptor]
return fetch
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
do {
try self.fetchedResultsController.performFetch()
} catch {
assertionFailure("Failed to fetch: \(error)")
}
chatCollectionView.reloadData()
}
Das Problem ist jetzt, dass die Chats, um korrekt zu sein scheint, aber die Abschnitte sind in alphabetischer Reihenfolge. Aber wenn ich einen Chat eintrage und es sende und wenn es von controllerDidChangeContent neu lädt, wird es korrigiert. Ich kann nicht herausfinden, warum es zunächst nicht in der richtigen Reihenfolge geladen wird. Ich verwende dafür eine Sammlungsansicht. Mache ich hier etwas falsch?