Domanda

Apple consiglia vivamente di utilizzare il formato binario plist durante la lettura di grandi set di dati basati su XML nelle app per iPhone. Tra i loro ragionamenti c'è il fatto che l'analisi XML è molto faticosa su iPhone. Tuttavia, ciò richiede che i file che risiedono sul server Web remoto vengano prima convertiti.

Per i contenuti che cambiano frequentemente, non è accettabile farlo manualmente. Se possibile, vorrei evitare che un'app basata sul web chiami la riga di comando per eseguire la conversione (ad esempio, plutil).

Esistono algoritmi disponibili pubblicamente per eseguire questa conversione?

È stato utile?

Soluzione

Sì. Tutto il codice plist fa parte di CoreFoundation, che è open source. CoreFoundation può essere creato ed eseguito direttamente su Linux e Windows, quindi puoi scrivere uno strumento CF utilizzando le normali API che utilizzeresti su Mac OS X, ma costruiscilo ed eseguilo su altre piattaforme.

L'API particolare che si desidera esaminare è CFPropertyListWriteToStream () . Il codice per CoreFoundation è disponibile da Apple ( tarball ), tra gli altri luoghi.

Infine, a seconda della frequenza con cui aggiorni il file, della quantità di processore che devi risparmiare sul server e della ripetizione dei tuoi dati, potrebbe esserci ancora un miglioramento significativo che puoi fare. Per impostazione predefinita, alcuni elementi nei plist binari sono unificati (come le stringhe). Altri elementi non lo sono (come array e dizionari). Il formato binario del plist consente loro di essere univoci, il problema è che è veramente costoso attraversare array e dizionari unici. Se hai molti array o dicts identici nei tuoi contenuti, potresti vedere una riduzione significativa delle dimensioni unificandoli. È possibile abilitarlo hackerando _flattenPlist () in CFBinaryPlist. c .

Se lo fai, assicurati di testarlo a fondo, e non lo fai su alcun file che non puoi aggiornare sulla rete, nel caso in cui una versione futura apporti delle ottimizzazioni che lo rompono. Inoltre, assicurati di essere pronto a spegnerlo in un attimo.

Altri suggerimenti

Esiste un'implementazione di PHP e ruby ??per questo:

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

L'implementazione di Ruby collegata è solo Ruby 1.9. Ho rovesciato un veloce serializzatore binario che funziona in Ruby 1.8.

http://gist.github.com/303378

Non è chiaro se si desidera eseguire la conversione su iPhone o sul server. Se si trova sul server e puoi utilizzare i framework Cocoa, NSPropertyListSerialization fornisce servizi per la conversione tra i tipi di plist supportati (stringa, XML e binario) su OS X (dal 10.2). Ci sono anche metodi analoghi nella libreria Core Foundation se preferisci usarlo invece.

Per convertire un plist XML in 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
    }
}

Vedi Elenco delle proprietà Pramming Guide su developer.apple.com per ulteriori informazioni.

Plutil dello strumento da riga di comando - utilità dell'elenco delle proprietà

Apple ha due ottimi strumenti da riga di comando per manipolare i file dell'elenco delle proprietà.

  • / usr / libexec / Plistbuddy - per la modifica dei piani
  • / usr / bin / plutil - controllo della sintassi e conversione del tipo

Dalla pagina man di plutil:

  

plutil può essere utilizzato per verificare la sintassi dei file dell'elenco delle proprietà o convertirlo        un file plist da un formato all'altro. Specifica: come file di input        legge dallo stdin.

Conversione di un plist esistente in formato XML, binario o JSON

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

Esiste anche un'implementazione Perl chiamata Data :: Plist

La binary_plist gem per aggiungere il plist come formato di risposta valido per i controller Rails sembra promettente.

Alcuni giorni fa ho riscontrato alcuni problemi sulla rete con i dati binari di plist in iOS e questo mio Gist è semplicemente quello di risolvere il problema: Plist Converter scritto in Swift

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top