在NSFetchedResultsController中排序部分问题

我正在做一个聊天应用程序,在那里我为每个聊天存储聊天时间,现在我需要首先显示最新的聊天记录,分组部分,例如:如果我今天有10个聊天记录,它应该放在名为7月10日的部分,2016年最后一次发送聊天。 为此,我正在通过chatTimestamp对列表进行排序,并且我还有另一个存储相应日期的sectionDate字段。 以下是核心数据中显示的示例数据格式。

<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重新加载时,它就会得到纠正。 我无法弄清楚它为什么最初不以正确的顺序加载。我为此使用了一个集合视图。 我在这里做错了什么?


我通过删除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!
        }

    }
链接地址: http://www.djcxy.com/p/6149.html

上一篇: Sorting sections issue in NSFetchedResultsController

下一篇: Custom NSSortDescriptor for NSFetchedResultsController