Tuesday 14 November 2017

Plist Format Binary Options


Im que intenta servir una lista de la característica de resultados de la búsqueda a mi app del iPhone. El servidor es un prototipo, escrito en Python. En primer lugar encontré Pythons incorporado en plistlib, que es impresionante. Quiero dar una foto de búsqueda como tu, así que necesito que sea lo más pequeño posible, y xml era demasiado grande. El formato plist binario parece una buena opción. Lamentablemente plistlib doesnt hacer archivos binarios, por lo que paso a la derecha PyObjC. (Segue: Estoy muy abierto a cualquier otro pensamiento sobre cómo llevar a cabo la búsqueda en vivo. Yo ya recortado los datos tanto como sea posible, incluyendo sólo mostrar suficientes resultados para llenar la ventana con el teclado del iPhone hacia arriba, que es 5.) Lamentablemente, Aunque conozco a Python y estoy consiguiendo bastante decente con Cocoa, todavía no consigo PyObjC. Este es el equivalente de Cocoa de lo que quiero hacer: Pensé que debería ser capaz de hacer algo como esto, pero dataWithPropertyList no está en la lista de objetos dir () NSPropertyListSerialization. También debería convertir la lista a NSArray. He probado los documentos PyObjC, pero es tan tangencial a mi trabajo real que pensé Id probar un SO SOS, también. Así es como estoy leyendo en el plist en el lado del iPhone. Feliz de aclarar si alguno de esto no tiene sentido. Property List Serialization Guardar datos en el sistema de archivos y leerlo de nuevo es una operación bastante común. Una de las primeras formas en las que muchos programadores de Cocoa e iOS aprenden a leer y escribir están usando las funciones de comodidad proporcionadas por NSArray. NSData. y amigos. NSDictionary tiene writeToFile: atómicamente: o writeToURL: atómicamente: para escribir y dictionaryWithContentsOfFile: o dictionaryWithContentsOfURL: para leer. Las llamadas de conveniencia suponen que sus datos están en formato de lista de propiedades (a. k.a. plist) y codificarán automáticamente las cosas para su posterior recuperación. Como recordatorio, los datos de la lista de propiedades significa que usted tiene una colección de objetos de sólo estos seis tipos, o sus contrapartes mutables: NSString. NSData. NSNumber. NSDate. NSArray. NSDictionary. Puede tener una serie de diccionarios con claves de cadena y valores de número y fecha y aún así considerarse una lista de propiedades. Cualquier otra clase está prohibida. Un NSColor o UIBezierPath en el diccionario hará que la colección no pertenezca a la lista. Sin embargo, estos métodos de lectura y escritura predeterminados son un poco flojos. No se puede controlar el formato de los datos se escribe - Cocoa hace lo que Cocoa hace. Theres también poco a ningún error de manejo en muchas de las llamadas, por lo que no hay mucha retroalimentación para decirle lo que es malo si alguien accidentalmente (o intencionalmente) agregó un pequeño objeto Pony a la colección cuando usted werent buscando. Youll tiene que codificar los objetos no plist en un tipo plist (normalmente NSData) para jugar en este patio. Además, se pierde la mutabilidad. Si guarda una matriz mutable que contiene cadenas modificables, obtendrá de nuevo sus equivalentes inmutables cuando vuelva a leer. Cocoa tiene dos clases de serialización de lista de propiedades que trabajan en torno a estos problemas: NSPropertyListSerialization (ese nombre de clase es sólo para decirlo) y NSJSONSerialization. NSPropertyListSerialization NSPropertyListSerialization toma objetos plist y los codifica en un NSData. Que puede escribir en un archivo, o enviar una conexión de red, o algo similar. La clase también puede tomar objetos plist, codificarlos, y escribirlos NSOutputStream. En la otra dirección, puede entregar NSPropertyListSerialization un NSData que obtuvo de algún lugar, o darle un NSInputStream con una secuencia de bytes de alguna parte. Si la decodificación funciona, obtendrá un puntero al objeto plist de nivel superior de la colección. Hay tres formatos usados ​​por la clase de serialización de la lista de propiedades. Theres el viejo formato OpenStep, que se parece mucho a JSON. No es terriblemente compacto, pero fácil de leer y editar. Sólo puede leer el formato de OpenStep - NSPropertyListSeialization no soporta escribirlo. Theres un formato XML, y un formato binario. El formato XML es legible por el usuario y editable mientras que el formato binario no lo es. Además: puede convertir un archivo de lista de propiedades existente entre formatos utilizando la utilidad plutil. De forma predeterminada, los archivos de lista de propiedades de preferencia se guardan en formato binario. Usted puede verificar eso, y después convertirlo: Usted puede abrir este plist en TextEdit (o su redactor preferido) revelar en su gloria de XML. Estos formatos corresponden a las constantes de serialización de lista de propiedades NSPropertyListOpenStepFormat. NSPropertyListXMLFormatv10. Y NSPropertyListBinaryFormatv10. Escribir listas de propiedades Ok, así que ¿cómo se utiliza NSPropertyListSerialization. Su realmente una clase con nada pero métodos de la clase. Nunca interactúas con instancias de NSPropertyListSerialization. Para serializar una lista de propiedades, necesita una lista de propiedades para serializar. El plist de la muestra será un diccionario con varios tipos del plist: (el código completo se puede encontrar en esta esencia) Cuando NSLogged, parece algo como esto: Una vez que usted tiene su objeto de la lista de la característica usted puede pre-vuelo él usando propertyList: isValidForFormat : Heres el comienzo de una función para guardar el plist como XML: Si quieres saber exactamente por qué no se puede guardar, adelante y tratar de codificar de todos modos e inspeccionar el error que vuelve. Normalmente, los errores de las listas de propiedades de formulario no pueden contener objetos de tipo BNRPony Para guardar realmente en formato XML, convierta la lista de propiedades en NSData: Observe el tratamiento de errores - compruebe siempre el valor de retorno del método, no el NSError. Si esa frase no significa mucho para usted, o si realmente prueba el valor de NSError, entonces vaya, ahora, y lea An NSError Error. El NSData ahora contiene una cadena codificada que es el XML completo de la lista de propiedades codificadas. Los argumentos a dataWithPropertyList. Son sencillos. Dale el objeto de nivel superior de tu gráfico de objetos de lista de propiedades. A continuación, una constante de formato, a continuación, cero para las opciones (es un titular de lugar) y, a continuación, el error obligatorio error de retorno. Una vez que haya obtenido los datos, puede escribirlos. Aquí se escribe en el directorio actual: La mayoría de las personas sanas usarán algo como NSSearchPathForDirectoriesInDomains o URLsForDirectory: inDomains: para obtener un buen lugar para soltar un archivo. Guardar en el formato binario es exactamente el mismo, excepto youd utilizar kCFPropertyListBinaryFormatv10. Lectura La reconstrucción de los objetos de la lista de propiedades funciona de la misma manera, sólo hacia atrás. Puede leer en el archivo OpenStep, XML o binario del sistema de archivos y, a continuación, utilizar un método de clase NSPropertyListSerialization para convertirlo en objetos reales vivos. Heres la función de contrapartida para saveAsXML. Dado un nombre de archivo, leerlo y deserializarlo. Heres la lectura del archivo en un NSData. Standard b-flat stuff: Y ahora la deserialización: Es un poco más complicado, pero demasiado. Usted le da los datos que contiene el contenido del archivo, junto con algunas opciones de creación. Más sobre ésos en un pedacito. Usted pasa la dirección de un NSPropertyListFormat para que pueda averiguar cuál era el formato original (si es importante / interesante para usted), así como la dirección de un puntero NSError para rellenar si algo salió mal. Heres el manejo de errores, y la impresión fuera del formato de archivo: Y luego el plist se devuelve de la función. Mutability Entonces, ¿qué es ese parámetro NSPropertyListImmutable? Ese parámetro controla los tipos de clases que se crean cuando se reconstituye la lista de propiedades. Inmutable es el comportamiento predeterminado (si pasa cero). Esto significa que todas las matrices serán NSArrays. Todos los diccionarios serán NSDictionaries. Todas las cadenas serán NSStrings. Y así sucesivamente, incluso si los objetos originales eran diccionarios, diccionarios o cadenas modificables. También puede pasar NSPropertyListMutableContainers para convertir todos los arrays y diccionarios en instancias NSMutableArray y NSMutableDictionary. Theres también NSPropertyListMutableContainersAndLeaves. Que le da mutable colecciones, así como NSMutableString s y NSMutableData s. No hay nada como mutable NSNumbers o NSDates. La mutabilidad de estos objetos no se guarda en el archivo plist. Si estás dependiendo de la mutabilidad que se conserva al escribir en un plist, o algo que es respaldado por plist (como NSUserDefaults), vas a romper. Los objetos inmutables son generalmente más seguros (no hay necesidad de preocuparse por un valor que cambia debajo de usted), así que prefiero usarlos. Pero si quieres manipular los resultados puedes modificar la mutabilidad. Si tiene una jerarquía existente de objetos plist pero con la mutabilidad incorrecta, puede pasarla a través de NSPropertyListSerialization para cambiarla, sin ir nunca al sistema de archivos. De acuerdo, tendrá varias copias de los datos en la memoria. El tipo de banderas de mutabilidad es una especie de verruga en la API. PropertyListWithData. Declara el tipo del parámetro de opciones como NSPropertyListReadOptions. De los cuales no hay valores. NSPropertyListImmutable y amigos son en realidad NSPropertyListMutabilityOptions s. Theyre todos los enums, por lo que realmente no importa, pero es uno de los pocos lugares que no puede confiar en lo que está en la cabecera. NSJSONSerialization NSjSONSerialization es como NSPropertyListSerialization. Excepto que emite y consume JSON en lugar de XML o binario. Es una clase relativamente nueva, disponible a partir de iOS 5 y Mac OS X 10.7. Hay algunas limitaciones en comparación con NSPropertyListSerialization. aunque. El objeto a codificar tiene que ser una colección - un NSArray o NSDictionary. No puedes usar números como las claves del diccionario. No puede guardar fechas o datos. Pero, puede guardar NSNull s, que no puede hacer con listas de propiedades. Las llamadas son muy similares a sus primas de serialización de lista de propiedades. Usted puede preflight: Convierta en un NSData: las serializaciones de JSON tiene una opción para la escritura - bastante impresión él con newlines y indentación. Pase cero para obtener la forma más compacta. Después de haberlo escrito y volver a leerlo, lo reconstituiría con: Los indicadores de opciones funcionan de manera diferente que con la serialización de lista de propiedades. Pase cero para obtener contenedores inmutables, o en bits-OR en estos indicadores para elegir y elegir diferentes características: contenedores Mutable le da arreglos mutables y diccionarios. Las hojas intercambiables le dan cadenas mutables. Puede obtener contenedores mutables y hojas pasando NSJSONReadingMutableContainers NSJSONReadingMutableLeaves. Puede elegir tener hojas mutables (NSMutableStrings) y contenedores inmutables, que no puede hacer con NSPropertyListSerialization. Observe que Apple corrigió la verruga API aquí. Estas constantes son del tipo NSJSONReadingOptions. Por lo que no hay un tipo de mutabilidad específica. La opción Permitir fragmentos permite que el JSON tenga un contenedor que no sea el objeto de nivel superior. Así que, en caso de que realmente utilice estos, ahora viene la gran pregunta. En caso de que realmente utilizan estas llamadas no los utilizaría para el almacenamiento de documentos de aplicaciones, a menos que mi documento realmente no era más que una colección de objetos de lista de propiedades. Theres mejor tecnología para que como NSCoding / Core Data / sqlite3 / etc. Dicho esto, lista de propiedades (y archivos JSON) puede ser muy útil para archivos auxiliares. Tener una pequeña base de datos de cosas Ponerlo en una lista de propiedades. Puede editarlo de forma gratuita con el editor plist encontrado en Xcode (o la versión independiente). Tiene algo configurable en su programa Puede poner su configuración en un archivo plist, y luego puede editar el archivo sin tener que volver a compilar su programa. (Pero es posible que desee utilizar NSUserDefaults para eso) Las llamadas JSON hacen que sea muy fácil empacar cosas antes de enviar a un servicio web y desempaquetar el resultado. Mark DalrympleQ. Edición. plist 8212 archivo parece binario Vine aquí originalmente para saber cómo podía mover mi carpeta de correo fuera de mi HD interno porque se consiguió bastante grande (12 GB). A partir de ahí aprendí sobre el archivo de prefs que vine aquí originalmente para saber cómo podía mover mi carpeta de correo de mi HD interno porque se consiguió bastante grande (12 GB). A partir de ahí aprendí sobre el archivo prefs que podría editar porque estaba en XML, o por lo que pensé. Pero cuando abro mi archivo de com. apple. mail. plist en BBEdit, theres porciones de gobbledygook que sugiere su un archivo binario. ¿Qué debo hacer? MB 2GhZ, Mac OS X (10.4.11) Publicado el Dic 29, 2007 7:03 PM por Niel, Solucionado Respuesta Nivel 10 (316,891 puntos) Algunos archivos plist están en un formato al que no se puede acceder o cambiar correctamente Desde un editor de texto. Utilice el comando defaults en el Terminal, que se encuentra en la carpeta / Applications / Utilities / o el Property List Editor, que forma parte de Xcode Tools o Server Admin Tools, para editar el archivo. Publicado el Dic 29, 2007 7:55 PM

No comments:

Post a Comment