2016-07-10 39 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! 
     } 

    }