Во-первых, я нашел пару связанных вопросов по этой проблеме со ссылками, вставленными ниже, но ни один из них не помог мне решить эту проблему:
Свойства iPhone CoreData: изменения в управляемых объектах слишком медленные
iOS CoreData: NSFetchedResultsController выступления
У меня есть таблица с приблизительно 5000 строк, которая в настоящее время управляется контроллером извлеченных результатов.
В каждой строке отображаются основные атрибуты объекта «Документ», а также кнопка, позволяющая пользователям пометить определенный документ как избранный.Следует признать, что сущность Document имеет отношения с несколькими различными сущностями, и базовая база данных SQLite является крупноватой (~ 20 МБ).
Выбор атрибутов для каждой строки является относительно быстрым, и табличное представление довольно хорошо работает с таким количеством элементов.,Сохранение изменений также не является проблемой.
Моя проблема возникает, когда я пытаюсь изменить атрибут isFavourite (BOOL) моего объекта Document.Этот атрибут устанавливается / обновляется при событии касания кнопки внутри:
[document setIsFavourite:[NSNumber numberWithBool:![document isFavourite]]]
Проблема здесь в том, что при каждом нажатии кнопки «Избранное» эта конкретная строка кода блокирует пользовательский интерфейс на ~ 1-2с, что явно не идеально.
Я пытался пометить атрибут isFavourite как индексированный, а также увеличить размер пакета выборки и, наконец, создать кэш для NSFetchedResultsController, но, похоже, ничего не помогает с производительностью.
Единственный способ избежать блокировки пользовательского интерфейса - это выполнить настройку атрибута в фоновом потоке, но это включает создание нового контекста, регистрацию уведомлений и объединение изменений при сохранении контекста.В этом случае возникает другая проблема, так как, когда я отвечаю на уведомление о сохранении с изменениями слияния, мой извлеченный контроллер результатов кажется сбитым с толку, и измененная строка автоматически удаляется из моего табличного представления, и единственный способ вернуть его - это сделатьa [tableview reloadData].
Кто-нибудь еще сталкивался с подобной проблемой, и есть ли еще что-нибудь, что я мог бы попытаться исправить?
Заранее большое спасибо,
Rog