2010-06-07 2 views
3

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

В Примере

Так что я создал пример приложения основных данных. Приложение в основном имитирует приложение AddressBook. У меня есть следующие лица: группа, контакт, адрес, телефон, электронная почта, веб-страница, даты.

Как вы, вероятно, догадываетесь, группа может иметь несколько контактов, а Контакт может быть в нескольких группах. Контакты также могут иметь несколько адресов, телефонов, электронных писем, веб-страниц и дат.

Я в основном импортировал около 600 контактов в это приложение из AddressBook. Пользовательский интерфейс относительно прост ... Список групп/категорий слева и NSCollectionView или NSTableView справа, который показывает список контактов в зависимости от выбранной группы. (Просмотр коллекции или представление таблицы ... по мере добавления возможность отображения любого вида, оба из которых связаны с NSArrayController)

Элементы группы, которые я втягиваю через код, в отличие от Interface Builder, потому что я хотел играть с подобной боковой панелью Thing, и это было гораздо проще сделать это таким образом.

Проблема

Одна из категорий содержит все контакты, в то время как другая категория содержит только 2 контакты. Когда я выбираю категорию, у которой есть все контакты, она занимает от 8 до 10 секунд, чтобы информация заполнила коллекцию или таблицу. Однако делать то же самое в самой AddressBook очень быстро, почти мгновенно. Я использую тип хранилища SQLLite и пытаюсь использовать множество различных подходов, включая попытку диагностики проблемы с помощью инструментов, но ничего не сработало.

Я пробовал задавать предикат по умолчаниюFetchPredicate контроллера массива Contact, а не устанавливать предикат фильтра, но это не сработало.

Я пробовал preFetching и неисправность, но я не уверен, что я делаю это правильно, и не совсем уверен, как это сделать, если Interface Builder обрабатывает NSArrayController контакта.

Другой пример

Я также попытался загрузив образец приложения Core Data ... в то время как она имеет более простую модель отношений, чем то, что я сделал (в основном Молекула имеет объекты Atom и объект Atom имеет Элементы объекта), я вставил 65 000 записей и сделал это как шарм.

Вопрос

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

Спасибо!

+0

Возможно, выберите связанные элементы в кусках 10 или 20 и продолжите лаять их асинхронно в фоновом режиме, после того, как будут показаны первые 10-20. – Nate

+1

Подружитесь с Instruments.app. Как и во всех вопросах производительности, любые ответы в лучшем случае догадываются до тех пор, пока вы не получите данные о производительности. Обратите особое внимание на выборку основных данных, пропуски кэша и, возможно, общие распределения объектов. –

+0

Я заметил, что было намного больше записок, чем я думаю, должно произойти. Например, когда приложение запускается первым, похоже, что он несколько раз извлекает объект Contact ... он буквально извлекает abotu 800 раз, но похоже, что количество выборки - только 1. И затем он извлекает еще два раза, когда он возвращает соответствующее количество объектов одновременно. Очень странно, поскольку я не запускаю такой код в цикле. – Patrick

ответ

1

Получается, что на самом деле NSCollectionView замедлил ход событий. Я предполагаю, что создание и манипулирование представлениями x количество просмотров коллекционного представления добавляет значительное количество накладных расходов. IKImageBrowserView можно было использовать, но это было не то, что я искал.

В результате я решил изменить макет приложения, чтобы решить эту проблему.

Спасибо всем!

Смежные вопросы