Frage

Apple empfiehlt nachdrücklich das binäre plist-Format, wenn große XML-basierten Lesen von Daten in iPhone-Anwendungen setzen. Unter ihren Überlegungen ist die Tatsache, dass XML-Analyse sehr auf dem iPhone zu besteuern. Dies erfordert jedoch, dass Dateien auf dem Remote-Web-Server befinden konvertiert werden.

Für häufig wechselnden Inhalten, ist es nicht akzeptabel, dies manuell zu tun. Wenn möglich, würde ich eine Web-basierte Anwendung zu vermeiden, wie die Befehlszeile aufrufen, die die Umwandlung durchzuführen (das heißt, plutil).

Gibt es öffentlich verfügbaren Algorithmen diese Konvertierung durchführen?

War es hilfreich?

Lösung

Ja. Alle plist Code ist ein Teil von Corefoundation, die Open-Source ist. Corefoundation kann unter Linux und Windows direkt gebaut und betrieben werden, so können Sie eine CF-Tool mit den normalen APIs schreiben Sie auf Mac OS X verwenden würde, aber bauen und sie auf anderen Plattformen laufen.

Die spezielle API Sie zu suchen wollen, ist CFPropertyListWriteToStream () . Der Code für Corefoundation ist von Apple- ( Tarball ), unter anderem.

Schließlich je nachdem, wie oft aktualisieren Sie die Datei, wie viel Prozessor auf dem Server zu ersparen, und wie viele Wiederholungen gibt es Ihre Daten kann es eine signifikante Verstärkung sein gelassen, dass Sie tun können. Standardmäßig bestimmte Elemente in binären plists sind uniqued (wie Strings). Andere Elemente sind nicht (wie Arrays und dictionarts). Das binäre plist-Format ermöglicht es ihnen uniqued werden, das Problem ist, dass es teuer ist, um tatsächlich durch und einzigartige Arrays und Wörterbücher zu Fuß. Wenn Sie eine Menge von identischen Arrays oder dicts in Ihrem Inhalt haben, können Sie eine deutliche Größenreduzierung sehen von ihnen uniquing. Sie können, dass aktivieren, indem Hacking bis _flattenPlist () in CFBinaryPlist. c .

Wenn Sie das tun, die es sicher zu testen, sehr gründlich, und tun nicht auf irgendwelche Dateien, die Sie nicht über das Netzwerk aktualisieren, falls eine zukünftige Version macht keine Optimierungen, dass brechen. Also, stellen Sie sicher, dass Sie bereit sind, sie deaktivieren zu einem Momente bemerken.

Andere Tipps

Es gibt eine PHP und Ruby-Implementierung für das:

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

Die verknüpfte Ruby-Implementierung ist Ruby 1.9 nur. Ich klopfte einen schnellen binären Serializer, die 1,8 in Ruby aufarbeitet.

http://gist.github.com/303378

Es ist nicht klar, ob Sie die Konvertierung auf dem iPhone oder auf dem Server tun mögen. Wenn es auf dem Server ist und Sie die Cocoa-Frameworks verwenden können, bietet die NSPropertyListSerialization Dienste zwischen den unterstützten plist Typen (string, XML und binär) auf OS X (ab 10.2) zu konvertieren. Es gibt auch analoge Verfahren in der Bibliothek Core Foundation, wenn Sie, dass stattdessen verwenden würden es vorziehen.

Um einen XML plist auf ein binäres konvertieren ein:

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

Siehe Eigenschaftenliste Pramming Führer Seite auf developer.apple.com für weitere Informationen.

Befehlszeilentool plutil - Eigenschaftsliste Dienstprogramm

hat Apple zwei sehr gute Kommandozeilen-Tools für Mangeln Eigenschaftslistendateien.

  • /usr/libexec/Plistbuddy - zur Bearbeitung plists
  • /usr/bin/plutil - Syntaxprüfung und Typumwandlung

Von plutil man-Seite:

  

plutil kann verwendet werden, um die Syntax von Eigenschaftslistendateien zu überprüfen oder konvertieren        eine plist-Datei von einem Format in ein anderes. Angeben - als Eingabedatei        liest aus stdin.

Konvertieren eines vorhandenen plist auf XML, Binary oder JSON-Format

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

Es ist eine Perl-Implementierung auch genannt Data :: Plist

Der binary_plist gem den plist als gültiges Antwortformat für Rails-Controller hinzuzufügen, sieht vielversprechend aus.

Serveral Tagen hatte ich einige Probleme gefunden auf die Vernetzung mit plist Binärdaten in iOS und diese Gist von mir ist, das Problem zu lösen einfach: Plist Converter geschrieben in Swift

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top