我在NSFetchedResultsController中遇到了fetchBatchSize的问题,所以我决定退一步,只在一个普通的NSFetchRequest上使用它。我创建了一个非常简单的项目,只有一个tableViewController,它有100个项目。这些项只有两个属性,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被视为无限,这将禁用批处理错误行为。 如果设置非零批处理大小,则在执行NSFetchRequest实例时返回的对象集合将分为批处理。执行提取时,将评估整个请求并记录所有匹配对象的标识,但是一次只能从持久性存储中提取直到batchSize的对象的数据。从执行请求返回的数组是一个代理对象,它根据需要透明地对批处理进行故障。 (在数据库术语中,这是一个内存中的游标。) 您可以使用此功能来限制应用程序中的工作数据集。与fetchLimit结合使用,您可以创建任意结果集的子范围。
我可以看到正在加载的故障数组中的100个项目。但是在滚动tableView之前,它会遍历5个20个项目的完整数据。 tableView一次显示大约15行。
我想要的行为是在滚动表时将数据加载到20个项目中
答案 0 :(得分:0)
如文档所示:
提取限制指定了请求所请求的最大对象数 应该在执行时返回。
fetchLimit
是您要寻找的。
答案 1 :(得分:0)
我怀疑您的代码中的某些内容实际上会遍历该数组并导致其触发错误。我不是在告诉您您自己故意-很有可能是UITableView的安装程序会执行此操作(根据内容,切片数据等预先计算单元格高度)。
我建议打开Instruments中的Core Data性能分析工具,并在引发故障时检查堆栈跟踪中的内容。
答案 2 :(得分:0)
fetchBatchSize与NSFetchedResultsController一起使用效果最佳。将您的fetchRequest放在NSFetchedResultsController中,然后使用NSFetchedResultsController访问获取的结果。然后肯定fetchBatchSize将起作用。或者,您可以在Google上搜索如何在获取结果中实现NSFetchedResultsController。