Прямой ответ на ваш вопрос - нет. Наилучшим вариантом с вашей текущей конструкцией является выполнение их в действии, но тогда у вас есть барьер для потоков, о котором нужно беспокоиться и который замедляет работу. Имейте в виду, что если ваши операции не выполняются в главном потоке, то вам нужна отдельная NSManagedObjectContext
для операции, или вы столкнетесь с проблемами потоков.
Лучший вопрос: Почему вы делаете новую выборку для каждого персонажа?
Если у вас уже есть результаты выборки из предыдущего поиска, и пользователь не удалил символ, просто возьмите существующие результаты и запустите свой предикат против NSArray
. Это дополнительно улучшит поиск вместо того, чтобы идти на диск каждый раз. Поскольку он находится в памяти, он будет очень быстрым.
При реализации поля поиска учитывайте следующие параметры:
- Хит диска только по первому символу
- Хит диска, только если символ удален из поля поиска
- Рассмотрите возможность предварительной загрузки objectID и свойства для поиска, чтобы избежать попаданий на диск.
В зависимости от того, что вы ищете (и есть способы перенормировать хранилище базовых данных для улучшения поиска), вы можете предварительно загружать в память немного. Даже с 42K записями, если свойства поиска достаточно малы, вы можете загрузить их все в память.
Скорее всего, вам все равно нужно проверить этот вариант использования, если пользователь начинает с нажатия "A".
Какая часть NSFetchRequest
медленная? Попадание в базу данных SQLite или загрузка данных в память? Исходя из своего ответа, вы можете улучшить эффективность поиска напрямую.