Pregunta

Apple recomienda encarecidamente utilizar el formato de lista binaria al leer grandes conjuntos de datos basados ??en XML en aplicaciones de iPhone. Entre su razonamiento está el hecho de que el análisis XML es muy exigente en el iPhone. Sin embargo, esto requiere que los archivos que residen en el servidor web remoto se conviertan primero.

Para contenido que cambia con frecuencia, no es aceptable hacerlo manualmente. Si es posible, me gustaría evitar que una aplicación basada en web llame a la línea de comando para realizar la conversión (es decir, plutil).

¿Hay algoritmos disponibles públicamente para realizar esta conversión?

¿Fue útil?

Solución

Sí Todo el código de plist es parte de CoreFoundation, que es de código abierto. CoreFoundation se puede construir y ejecutar directamente en Linux y Windows, por lo que puede escribir una herramienta CF utilizando las API normales que usaría en Mac OS X, pero compilarla y ejecutarla en otras plataformas.

La API particular que quiere ver es CFPropertyListWriteToStream () . El código para CoreFoundation está disponible en Apple ( tarball ), entre otros lugares.

Finalmente, según la frecuencia con la que actualice el archivo, la cantidad de procesador que le sobra al servidor y la cantidad de repetición de sus datos, puede quedar una mejora significativa que puede hacer. Por defecto, ciertos elementos en listas binarias son únicos (como cadenas). Otros elementos no lo son (como arrays y dictionarts). El formato binario plist les permite ser únicos, el problema es que es costoso recorrerlos y tener matrices y diccionarios únicos. Si tiene muchas matrices o dictos idénticos en su contenido, puede ver una reducción significativa de tamaño al desligarlos. Puede habilitarlo pirateando _flattenPlist () en CFBinaryPlist. c .

Si lo hace, asegúrese de probarlo a fondo y no lo haga en ningún archivo que no pueda actualizar a través de la red, en caso de que una versión futura haga alguna optimización que lo rompa. Además, asegúrese de estar listo para apagarlo en cualquier momento.

Otros consejos

Hay una implementación de PHP y Ruby para eso:

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

La implementación vinculada de Ruby es solo Ruby 1.9. Abrí un serializador binario rápido que funciona en Ruby 1.8.

http://gist.github.com/303378

No está claro si desea realizar la conversión en el iPhone o en el servidor. Si está en el servidor y puede usar los marcos Cocoa, el NSPropertyListSerialization proporciona servicios para convertir entre los tipos de plist compatibles (cadena, XML y binario) en OS X (desde 10.2). También hay métodos análogos en la biblioteca de Core Foundation si prefiere usar eso en su lugar.

Para convertir un plist XML a uno binario:

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

Ver Guía de encuadre de lista de propiedades en developer.apple.com para obtener más información.

Herramienta de línea de comandos plutil - utilidad de lista de propiedades

Apple tiene dos muy buenas herramientas de línea de comandos para manipular archivos de lista de propiedades.

  • / usr / libexec / Plistbuddy - para editar listas
  • / usr / bin / plutil - comprobación de sintaxis y conversión de tipos

Desde la página de manual de plutil:

  

plutil se puede usar para verificar la sintaxis de los archivos de lista de propiedades, o convertir        un archivo plist de un formato a otro. Especificando - como un archivo de entrada        lee de stdin.

Convertir un plist existente a formato XML, Binario o JSON

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

También hay una implementación de Perl llamada Data :: Plist

La binary_plist gem para agregar el plist como un formato de respuesta válido para los controladores Rails parece prometedor.

Hace varios días, encontré algunos problemas en la red con datos binarios plist en iOS y este Gist mío es resolver el problema simplemente: Convertidor de listas escrito en Swift

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top