NSFetchRequest fetchBatchSize不工作。

问题描述 投票:4回答:3

我一直在NSFetchedResultsController中遇到fetchBatchSize的问题,所以我决定退而求其次,在一个普通的NSFetchRequest上使用它。 我创建了一个非常简单的项目,只有一个有100个项目的tableViewController。 这些项目只有两个属性,itemID和itemName。 我使用以下方法来填充数据数组。

func initializeItems() {
        let request = NSFetchRequest<Item>(entityName: "Item")
        let messageSort = NSSortDescriptor(key: "itemName", ascending: true)
        request.sortDescriptors = [messageSort]
        request.fetchBatchSize = 20
        do {
            let fetchedResults = try context.fetch(request)
            if fetchedResults.count > 0 {
                self.items = fetchedResults
                //self.tableView.reloadData()
            }
        } catch {
            print("Could not fetch \(error)")
        }
    }

这个方法在tableViewController的viewDidLoad中被调用。 上下文的定义如下。

let appDelegate = UIApplication.shared.delegate as! AppDelegate
self.context = appDelegate.persistentContainer.viewContext

当我运行应用程序时,表格显示所有的行已经完全填充(如滚动条所示)。

我不明白为什么fetchBatchSize被忽略了。

文档如下。

在取回请求中指定的对象的批次大小,默认值为0。 默认值为0.批处理大小为0会被视为无限大,从而禁用批断行为。 如果设置了非零的批处理大小,当执行NSFetchRequest实例时,返回的对象集合会被分成若干个批次。当执行获取时,整个请求会被评估,并记录所有匹配对象的身份,但每次只会从持久化存储中获取批次大小以内的对象的数据。执行请求返回的数组是一个代理对象,它可以透明地按需对批次进行故障处理。(用数据库术语来说,这是一个内存中的游标。)你可以使用这个特性来限制应用程序中的数据工作集。结合fetchLimit,你可以创建一个任意结果集的子范围。

我可以看到故障数组中的100个项目被加载。 但是,在滚动tableView之前,它循环地加载了5次20项完整数据。 tableView一次大约显示15行。

我想要的行为是在滚动表格时,数据以20项的方式分批加载。

ios swift xcode core-data nsfetchrequest
3个回答
0
投票

如文档中所示。

fetch limit指定了一个请求在执行时应该返回的对象的最大数量.

fetchLimit 就是你要找的东西。


0
投票

我怀疑你的代码中的某些东西实际上是在迭代那个数组,并导致它发出故障。我不是说你自己故意这么做--很可能是你的UITableView的设置做的(根据内容预先计算单元格高度,分割数据等)。

我的建议是在Instruments中打开Core Data profiling工具,检查当故障被触发时堆栈跟踪中的内容。


0
投票

fetchBatchSize与NSFetchedResultsController配合使用效果最好。把你的fetchRequest放到NSFetchedResultsController中,然后用NSFetchedResultsController来访问fetched结果。然后肯定fetchBatchSize会工作。或者你可以google一下NSFetchedResultsController是如何实现获取结果的。

© www.soinside.com 2019 - 2024. All rights reserved.