2016-07-10 26 views
1

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?

Antwort

1

Ich habe das Problem behoben, indem ich das NSManaged-Attribut für sectionDate entfernt und es wie unten hinzugefügt habe, und die Eigenschaft im Kerndatenmodell vorübergehend gemacht und es funktioniert.

var sectionDate: String { 
     get { 
      self.willAccessValueForKey("sectionDate") 
      var ddtmp = self.primitiveValueForKey("sectionDate") as! String? 
      self.didAccessValueForKey("sectionDate") 

      if (ddtmp == nil) 
      { 
       ddtmp = Utilities.stringFromDate(self.chatTimestamp!, dateFormat: "MMM dd, yyyy") 
       self.setPrimitiveValue(ddtmp, forKey: "sectionDate") 

      } 


      return ddtmp! 
     } 

    }