NSFetchRequest fetchBatchSize не работает - PullRequest
0 голосов
/ 07 июня 2018

У меня были проблемы с fetchBatchSize в NSFetchedResultsController, поэтому я решил сделать шаг назад и использовать его только для простого 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)")
        }
    }

Это вызывается в viewDidLoad tableViewController.Контекст определяется следующим образом:

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

Когда я запускаю приложение, таблица отображает полностью заполненный (как показано на полосе прокрутки) все строки.

Я не понимаю, почему fetchBatchSize игнорируется.

Документация выглядит следующим образом:

Размер пакета объектов, указанных в запросе на выборку.Значение по умолчанию равно 0. Размер пакета 0 рассматривается как бесконечный, что отключает поведение ошибки пакета.Если вы установите ненулевой размер пакета, коллекция объектов, возвращаемых при выполнении экземпляра NSFetchRequest, будет разбита на пакеты.Когда выборка выполняется, весь запрос оценивается, и идентификаторы всех соответствующих объектов записываются, но только данные для объектов вплоть до batchSize будут извлекаться из постоянного хранилища за один раз.Массив, возвращаемый при выполнении запроса, является прокси-объектом, который прозрачно сбрасывает пакеты по требованию.(В терминах базы данных это курсор в памяти.) Вы можете использовать эту функцию, чтобы ограничить рабочий набор данных в вашем приложении.В сочетании с fetchLimit вы можете создать поддиапазон произвольного набора результатов.

Я вижу 100 загружаемых элементов в массиве ошибок.Но затем он просматривает 5 загрузок из 20 элементов полных данных до прокрутки tableView.TableView показывает около 15 строк одновременно.

Мне нужно, чтобы данные загружались в 20 пакетах элементов при прокрутке таблицы

Ответы [ 2 ]

0 голосов
/ 13 июля 2018

Я подозреваю, что что-то в вашем коде на самом деле проходит через этот массив и вызывает его ошибку.Я не говорю, чтобы вы делали это сознательно самостоятельно - вполне вероятно, что настройка UITableView делает это (предварительный расчет высоты ячейки на основе содержимого, данных секционирования и т. Д.).

Я предлагаю открытьИнструмент профилирования базовых данных в инструментах и ​​проверьте, что находится в трассировке стека при возникновении ошибок.

0 голосов
/ 12 июля 2018

Как показано в документации:

Предел выборки определяет максимальное количество объектов, которые запрос должен вернуть при выполнении.

fetchLimit - это то, что выищу.

...