2009-08-12 2 views
0

Я разрабатываю приложение в какао. Мне нужно разобрать XML-файл большого размера (около 25 МБ) iTunes. Теперь я использую следующий фрагмент кода: NSDictionary * itunesDatabase = [Словарь NSDictionaryWithContentsOfFile: itunesPath ]; Но это немного медленнее Есть ли какой-нибудь более быстрый способ загрузить все данные в словарь?iTunes XML Анализ в какао

+0

ли вам действительно нужно, чтобы сделать это быстрее, или это проблема более, что основной поток блокируется во время загрузки файла? –

ответ

0

Если вы используете сторонние фреймворки, запустите, не ходите до EyeTunes. (Лицензия BSD). Это слой абстракции вокруг Apple Events для связи с iTunes, и поэтому он не анализирует базу данных XML напрямую (я думаю, что прошло некоторое время с тех пор, как я ее использовал), но вы будете иметь получить/установить доступ к чему-либо в XML.

+1

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

3

Причина, по которой у вас такая низкая производительность, заключается в том, что NSDictionary считывает все в память сразу. Для большой библиотеки iTunes это может занять много времени и - не стесняйтесь подтверждать это с помощью Activity Monitor - метрической памяти. (Это точный технический термин для этого объема памяти)

Альтернативой в этих ситуациях является использование XML-анализатора на основе обратного вызова (обычно называемого синтаксическими анализаторами SAX). Эти синтаксические XML-документы обрабатывают объект одновременно и вызывают методы обратного вызова. В Cocoa класс NSXMLParser обеспечивает эту функциональность. Вы назначаете свой класс в качестве его делегата, вызываете метод parse, и синтаксический анализатор запускает вызовы методов делегата, когда он читает теги, атрибуты, текст и т. Д. В файле XML.

Теперь это, очевидно, сложнее, чем просто загрузить все в NSDictionary и пройти по дереву объектов. Вам нужно будет самостоятельно отслеживать информацию о состоянии. И вам придется «наращивать» свои объекты постепенно, поэтому организовать ваши классы может быть сложно.

Однако вы можете игнорировать XML, который вам неинтересен, и это экономит много памяти. И, в зависимости от того, какие данные вы получаете из iTunes, вы также сможете закончить разбор, как только получите нужные вам данные. Даже если это закончится довольно долго, по крайней мере, вы сможете показать вашему пользователю индикатор выполнения или другое указание на то, что ваша программа работает, что намного лучше, чем просто висит на 10-20 секунд, пока NSDictionary загрузок гигантский файл XML.

+0

Обратите внимание, что NSXMLParser все время считывает все в память сразу, поскольку 'initWithData:' является его назначенным инициализатором. –