Pergunta

A Apple recomenda usando o formato plist binário ao ler grandes conjuntos de dados baseados em XML em aplicativos do iPhone. Entre seu raciocínio é o fato de que a análise XML é muito desgastante para o iPhone. No entanto, isso requer que os arquivos que residem no servidor web remoto ser convertido em primeiro lugar.

Para frequência de mudança de conteúdo, não é aceitável para fazer isso manualmente. Se possível, eu gostaria de evitar ter um aplicativo baseado na web chamada da linha de comando para executar a conversão (ou seja, plutil).

Existem publicamente algoritmos disponíveis para executar esta conversão?

Foi útil?

Solução

Sim. Todo o código do plist é parte de CoreFoundation, que é opensource. CoreFoundation pode ser diretamente construído e executado em Linux e Windows, assim você pode escrever uma ferramenta CF usando as APIs normais que você usaria no Mac OS X, mas de construção e executá-lo em outras plataformas.

A API específico que você deseja estar olhando é CFPropertyListWriteToStream () . O código para CoreFoundation está disponível de a Apple ( tarball ), entre outros lugares.

Finalmente, dependendo de quantas vezes você atualizar o arquivo, quanto processador que você tem de sobra no servidor, e quanto a repetição não é os seus dados pode haver uma melhoria significativa esquerda que você pode fazer. Por certos elementos padrão em plists binários são uniqued (tais como cordas). Outros elementos são não (tais como matrizes e dictionarts). O formato plist binário permite que eles sejam uniqued, a questão é que ele é caro para realmente caminhar e matrizes originais e dicionários. Se você tem um monte de matrizes ou dicts idênticos em seu conteúdo que você pode ver uma redução de tamanho significativa por uniquing eles. Você pode ativar o que cortando-se _flattenPlist () in CFBinaryPlist. c .

Se você fizer isso certifique-se de testá-lo muito bem, e não fazer em todos os arquivos que você não pode atualizar através da rede, apenas no caso de um lançamento futuro faz qualquer otimizações que quebrar isso. Além disso, verifique se você está pronto para desligá-lo em um aviso momentos.

Outras dicas

Há uma aplicação PHP e Ruby para isso:

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

A implementação de Ruby vinculado é Ruby 1.9 somente. Bati-se uma rápida serializador binário que funciona no Ruby 1.8.

http://gist.github.com/303378

Não está claro se você quiser fazer a conversão no iPhone ou no servidor. Se é no servidor e você pode usar os quadros de cacau, o NSPropertyListSerialization fornece serviços para converter entre os tipos suportados plist (String, XML e binário) no OS X (desde 10,2). Existem também métodos análogos na biblioteca Núcleo Foundation se você preferir usar que em vez.

Para converter um plist XML para um binário:

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
    }
}

Veja Lista Property Guide Pramming em developer.apple.com para mais informações.

ferramenta de linha de comando plutil - lista de propriedades utilitário

A Apple tem duas boas ferramentas de linha de comando para desconfiguração arquivos de lista propriedade.

  • /usr/libexec/Plistbuddy - para editar plists
  • /usr/bin/plutil - sintaxe verificação e conversão de tipo

A partir da página homem plutil:

plutil pode ser usado para verificar a sintaxe de arquivos de lista de propriedade, ou converter um arquivo plist de um formato para outro. Especificando - como um arquivo de entrada lê de stdin.

Convertendo um plist existente para XML, binário, ou JSON formato

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

Há uma implementação Perl também chamado Data :: Plist

O binary_plist gem para adicionar o plist como um formato de resposta válida para Rails controladores parece promissor.

dias serveral atrás eu tinha encontrado alguns problemas na rede com dados binários plist em iOS e esta Gist da mina é para resolver o problema simplesmente: Plist Converter escrito em Swift

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top