如何将更多的提取数据添加到NSFetchedResultsController

时间:2018-07-08 23:22:32

标签: ios swift xcode core-data nsfetchedresultscontroller

我有一个NSFetchedResultsController可以在tableView中显示消息。

我想使用fetchLimit属性批量加载消息。 (fetchBatchSize对我不起作用,因为我为sectionNameKeyPath使用了过渡属性)

最初,我得到的消息偏移了80。从那里开始,我使用该消息的日期来设置fetchedResultsController fetch的谓词。

当用户滚动到聊天表的顶部时,我想再加载80条消息。当前,我使用提取请求来获取与先前加载的最后一条消息相比偏移80的消息。然后,我可以获取该消息的日期,并使用该日期重新初始化fetchedResultsController。然后加载160条消息。依此类推。

理想情况下,我不会再次获取最初的80条消息。仅加载另外的80条消息并将它们与已经加载的80条消息合并。不知道如何实现这一目标。

使用第一次提取初始化fetchedResultsController之后,是否可以从后续提取请求中添加更多数据而无需重新加载原始数据?

这是我用来初始化fetchedResultsController的内容:

var firstMessageDate: Date?

func initializeResultsController() {
    let firstRequest:NSFetchRequest<Message> = Message.fetchRequest()

    if firstMessageDate != nil {
        let dateSort = NSSortDescriptor(key: "messageDateCreated", ascending: false)
        firstRequest.sortDescriptors = [dateSort]
        firstRequest.predicate = NSPredicate(format: "messageDateCreated < %@", firstMessageDate! as NSDate)
    } else {
        let dateSort = NSSortDescriptor(key: "messageDateCreated", ascending: false)
        firstRequest.sortDescriptors = [dateSort]
    }

    firstRequest.fetchLimit = 1
    firstRequest.fetchOffset = 80

    do {
        let fetchedResults = try context.fetch(firstRequest)
        firstMessageDate = fetchedResults.first?.messageDateCreated
    } catch {
        print("Could not fetch \(error)")
    }


    let request:NSFetchRequest<Message> = Message.fetchRequest()

    let dateSort = NSSortDescriptor(key: "messageDateCreated", ascending: true)
    request.sortDescriptors = [dateSort]

    request.predicate = NSPredicate(format: "messageDateCreated > %@", firstMessageDate! as NSDate)

    fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: "messageDateSectionIdentifier", cacheName: nil)

    fetchedResultsController.delegate = self

    do {
        try fetchedResultsController.performFetch()
        self.tableView.reloadData()

    } catch {
        fatalError("Failed to initialize FetchedResultsController: \(error)")
    }
}

这是我的scrollView委托:

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if scrollView.contentOffset.y < 0 {
            initializeResultsController()
        }
    }

0 个答案:

没有答案