CoreData NSArrayController addObject: мучительно медленно - PullRequest
2 голосов
/ 01 июля 2011

У меня есть приложение CoreData, которое импортирует информацию из файла * .xml.Файл состоит из двух разделов: резюме и подробностей.

По сути, у меня есть два табличных представления: tvSummary и tvDetail;два контроллера массива, acSummary и acDetail;и один изменяемый массив, maDetail.

Я использую метод [acSummary addObject:newSummaryData]; для добавления сводных записей данных в контроллер массива acSummary при импорте файла.После импорта файла поля сводных данных заполняют табличное представление tvSummary.

Когда я использую метод [acDetail addObject:newDetailData]; для добавления подробных записей данных в контроллер массива acDetail, для импорта может потребоваться до двадцати минут.72000 записей (большинство файлов содержат от 3600 до 21600 записей).По завершении этого длительного процесса импортированные поля подробных данных заполняют табличное представление tvDetail.Когда я делаю выбор в табличном представлении tvSummary, данные, отображаемые в табличном представлении tvDetail, изменяются в соответствии с выбранной строкой.Я думаю, именно так оно и должно работать.

Во время процесса обучения Какао / Objective-c / Core Data (я еще неофит) я обнаружил, что могу скопировать 72000 записей в изменяемый массив maDetail воколо пяти секунд.Я также обнаружил, что могу скопировать содержимое изменяемого массива maDetail в контроллер массива acDetail примерно за две секунды, используя метод [acDetail setContent:maDetail];.

Я не могу понять, как получить контроллер массива acDetailзапомнить содержимое, которое было дано при выборе другой строки в табличном представлении tvSummary.Я вижу ссылки на принуждение контроллера массива 'save', однако я не могу найти никакой документации о том, как реализовать такой метод.Любой совет или направление будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Я не совсем уверен, что понимаю ваши настройки, но мне кажется, что вы неправильно используете контроллеры массива с Core Data. Вам не нужно добавлять объекты непосредственно в контроллер, если вы используете Core Data.

Вы должны иметь возможность добавлять новые объекты непосредственно в граф объектов Core Data (просто вставляя их), и контроллеры автоматически выбирают их существование. И наоборот, контроллер должен также знать об удалениях или обновлениях.

Контроллеры будут наблюдать контекст Core Data и автоматически реагировать на его изменения. Именно так работает связывание и почему вы можете написать целое приложение практически без кода.

2 голосов
/ 01 июля 2011

NSArrayController - это, как говорит нам документация для этого класса, «совместимый с привязками класс, который управляет коллекцией объектов».Привязки какао подобны автоматическому контроллеру, который синхронизирует данные между объектами модели и представления - каждый раз, когда вы изменяете связанное свойство, все объекты, связанные с этим свойством, уведомляются и при необходимости обновляются.

Если выдобавляя 72 000 объектов по одному в изменяемый массив через NSArrayController, вполне вероятно, что отправляется очень много ненужных уведомлений и выполняется множество бесполезных обновлений.Есть несколько способов решить эту проблему, но я бы посоветовал сначала попробовать самую простую вещь ...

Вместо добавления каждой записи по отдельности, добавьте все записи в отдельный изменяемый массив.Когда это будет сделано, добавьте все объекты в управляемый массив сразу, используя метод -addObjects: NSArrayController.Это должно уведомить наблюдателей о том, что массив менялся один раз, а не один раз для каждого объекта, и я думаю, что вы увидите существенное улучшение производительности.

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

...