Вопрос

Apple настоятельно рекомендует использовать двоичный формат plist при чтении больших наборов данных на основе XML в приложениях iPhone.Среди их аргументов - тот факт, что синтаксический анализ XML на iPhone очень трудоемкий.Однако для этого требуется, чтобы файлы, находящиеся на удаленном веб-сервере, были сначала преобразованы.

Для часто меняющегося контента недопустимо делать это вручную.Если это вообще возможно, я бы хотел, чтобы веб-приложение не вызывало командную строку для выполнения преобразования (т. Е. plutil).

Существуют ли общедоступные алгоритмы для выполнения этого преобразования?

Это было полезно?

Решение

ДА.Весь код plist является частью CoreFoundation, который является открытым исходным кодом.CoreFoundation может быть собран и запущен непосредственно в Linux и Windows, так что вы можете написать инструмент CF, используя обычные API, которые вы использовали бы в Mac OS X, но создавать и запускать его на других платформах.

Конкретный API, на который вы хотите обратить внимание, - это CFPropertyListWriteToStream().Код для CoreFoundation доступен по адресу Apple (тарболл), среди других мест.

Наконец, в зависимости от того, как часто вы обновляете файл, сколько процессора у вас есть на сервере и насколько часто повторяются ваши данные, может остаться одно существенное улучшение, которое вы можете сделать.По умолчанию некоторые элементы в двоичных списках уникальны (например, строки).Другие элементы таковыми не являются (например, массивы и словари).Двоичный формат plist позволяет им быть уникальными, проблема в том, что на самом деле обходится дорого просматривать уникальные массивы и словари.Если в вашем контенте много одинаковых массивов или диктовок, вы можете значительно уменьшить их размер, сделав их уникальными.Вы можете включить это, взломав _flattenPlist() в CFBinaryPlist.c.

Если вы сделаете это, обязательно протестируйте это очень тщательно и не делайте этого с файлами, которые вы не можете обновить по сети, на случай, если в будущем выпуске будут внесены какие-либо оптимизации, которые нарушат это.Кроме того, убедитесь, что вы готовы отключить его в любой момент.

Другие советы

Для этого есть реализация PHP и ruby:

http://code.google.com/p/cfpropertylist/

Связанная реализация Ruby - это только Ruby 1.9. Я запустил быстрый двоичный сериализатор, который работает в Ruby 1.8.

http://gist.github.com/303378

Непонятно, хотите ли вы конвертировать на iPhone или на сервере. Если он находится на сервере и вы можете использовать каркасы Cocoa, NSPropertyListSerialization предоставляет службы для преобразования между поддерживаемыми типами plist (string, XML и binary) в OS X (начиная с 10.2). Есть и аналогичные методы в библиотеке Core Foundation, если вы предпочитаете использовать это вместо этого.

Чтобы преобразовать XML-лист в двоичный файл:

NSString *xmlPlistPath; // already set
NSString *outPath; // already set


NSData *plistData;
NSString *error;
NSPropertyListFormat format;
id plist;
plistData = [NSData dataWithContentsOfFile:xmlPlistPath];

plist = [NSPropertyListSerialization propertyListFromData:plistData
                                         mutabilityOption:NSPropertyListImmutable
                                                   format:&format
                                         errorDescription:&error];

if(plist == nil) { // unable to parse plist
    //deal with failure -- error gives description of the error
} else {
    binaryPlistData = [NSPropertyListSerialization dataFromPropertyList:plist
                                                                 format:NSPropertyListBinaryFormat_v1_0
                                                       errorDescription:&error];
    if(binaryPlistData == nil) {//unable to create serialized plist
         // deal with failure -- error gives description of the error
    }

    if(![binaryPlistData writeToFile:outPath atomically:YES]) {
        // unable to write file
    }
}

См. Страница руководства по составлению списка свойств на developer.apple.com для получения дополнительной информации.

Инструмент командной строки plutil - утилита для составления списка свойств

У Apple есть два очень хороших инструмента командной строки для искажения файлов списка свойств.

  • /usr/libexec/Plistbuddy - для редактирования списков
  • /usr/bin/plutil - проверка синтаксиса и преобразование типов

Со страницы руководства plutil:

plutil можно использовать для проверки синтаксиса файлов списка свойств или для преобразования файла plist из одного формата в другой.Указание - в качестве входного файла считывается из стандартного интерфейса.

Преобразование существующего списка в формат XML, двоичный файл или JSON

plutil -convert xml1 stops2.plist
plutil -convert binary1 stops2.plist
plutil -convert json stops2.plist

Существует также реализация Perl Data :: Plist

двоичный_плист добавить plist в качестве допустимого формата ответа для контроллеров Rails выглядит многообещающе.

Несколько дней назад я обнаружил некоторые проблемы в сети с бинарными данными plist в iOS, и моя Gist предназначена для простого решения этой проблемы: Конвертер Plist, написанный на Swift

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top