NSFetchRequest fetchBatchSize 不起作用

ali*_*ego 5 xcode core-data nsfetchrequest ios swift

我在 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)")
        }
    }
Run Code Online (Sandbox Code Playgroud)

这在 tableViewController 的 viewDidLoad 中调用。上下文定义如下:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
self.context = appDelegate.persistentContainer.viewContext
Run Code Online (Sandbox Code Playgroud)

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

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

文档如下:

提取请求中指定的对象的批量大小。默认值为 0。批量大小为 0 被视为无限,这将禁用批量故障行为。如果您设置了一个非零的批量大小,则在执行 NSFetchRequest 实例时返回的对象集合将被分成多个批次。执行提取时,会评估整个请求并记录所有匹配对象的身份,但一次只会从持久存储中提取不超过batchSize 的对象的数据。执行请求返回的数组是一个代理对象,它可以按需透明地对批次进行故障处理。(在数据库术语中,这是一个内存中游标。)您可以使用此功能来限制应用程序中的工作数据集。结合 fetchLimit,

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

我想要的行为是在表格滚动时以 20 个项目批次加载数据

Cha*_*irA 0

如文档所示:

获取限制指定请求执行时应返回的最大对象数。

fetchLimit这就是您正在寻找的。