Атрибут установки NSManagedObject блокирует интерфейс iPad в Core Data - PullRequest
0 голосов
/ 18 июля 2011

Во-первых, я нашел пару связанных вопросов по этой проблеме со ссылками, вставленными ниже, но ни один из них не помог мне решить эту проблему:

Свойства 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

1 Ответ

1 голос
/ 18 июля 2011

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

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

Во-первых, у вас есть собственный аксессор для setIsFavourite:, который вызывает побочные эффекты, которые приводят к сбоям и выборкам. Например. У вас есть пользовательская логика, которая срабатывает при изменении атрибута isFavourite, который запускает извлеченное свойство.

Я склоняюсь к этому объяснению, потому что вы используете старую справочную форму вместо:

document.isFavourite=[NSNumber numberWithBool:![document isFavourite]];

Если вы создали класс объекта document вручную, убедитесь, что вы использовали @dynamic вместо @synthesize для свойств. Последнее не будет хорошо работать с подклассами NSManagedObject.

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

Я довольно сомневаюсь, что строка кода на самом деле является источником проблемы.

...