Я уже давно работаю над этой проблемой, и я открыт для любых лучших практик/советов.Основные данные и низкая производительность
В Примере
Так что я создал пример приложения основных данных. Приложение в основном имитирует приложение 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 записей и сделал это как шарм.
Вопрос
Я в основном врезался в стену, и мне интересно, если кто-то знает, почему это происходит, и лучший способ исправить/преодолевают/избежать такого рода проблемы?
Спасибо!
Возможно, выберите связанные элементы в кусках 10 или 20 и продолжите лаять их асинхронно в фоновом режиме, после того, как будут показаны первые 10-20. – Nate
Подружитесь с Instruments.app. Как и во всех вопросах производительности, любые ответы в лучшем случае догадываются до тех пор, пока вы не получите данные о производительности. Обратите особое внимание на выборку основных данных, пропуски кэша и, возможно, общие распределения объектов. –
Я заметил, что было намного больше записок, чем я думаю, должно произойти. Например, когда приложение запускается первым, похоже, что он несколько раз извлекает объект Contact ... он буквально извлекает abotu 800 раз, но похоже, что количество выборки - только 1. И затем он извлекает еще два раза, когда он возвращает соответствующее количество объектов одновременно. Очень странно, поскольку я не запускаю такой код в цикле. – Patrick