2016-07-10 37 views
1

我正在做一個聊天應用程序,我在這裏爲每個聊天存儲聊天時間,現在我需要先顯示最新的聊天信息,分組在部分中,例如:如果我今天有10個聊天記錄它應該在2016年7月10日的部分,最後一次發送聊天。爲此,我正在通過chatTimestamp對列表進行排序,並且我還有另一個存儲相應日期的sectionDate字段。以下是核心數據中顯示的示例數據格式。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:…>」; 
}) 

這也是迄今爲止

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() 

    } 

一個我的代碼部分現在的問題是,聊天,似乎有正確順序,但部分是按字母順序。但是,如果我輸入聊天併發送它,並從controllerDidChangeContent重新加載它會得到更正。 我無法弄清楚它爲什麼最初不以正確的順序加載。我正在使用一個集合視圖。我在這裏做錯了什麼?

回答

1

我通過刪除sectionDate的NSManaged屬性解決了問題,並像下面那樣添加它,並在核心數據模型中創建了屬性瞬態並且工作。

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! 
     } 

    }