Question

Apple recommande vivement d'utiliser le format binaire plist lors de la lecture de grands ensembles de données XML dans les applications iPhone. Parmi leurs arguments, citons le fait que l'analyse XML est très éprouvante pour l'iPhone. Toutefois, cela nécessite que les fichiers résidant sur le serveur Web distant soient d'abord convertis.

Pour le contenu fréquemment modifié, il n'est pas acceptable de le faire manuellement. Dans la mesure du possible, j'aimerais éviter qu'une application Web appelle la ligne de commande pour effectuer la conversion (c'est-à-dire, plutil).

Existe-t-il des algorithmes publiquement disponibles pour effectuer cette conversion?

Était-ce utile?

La solution

Oui. Tout le code de plist fait partie de CoreFoundation, qui est opensource. CoreFoundation peut être directement construit et exécuté sur Linux et Windows, vous pouvez donc écrire un outil CF à l'aide des API normales que vous utiliseriez sous Mac OS X, mais le construire et l'exécuter sur d'autres plateformes.

L'API particulière que vous souhaitez consulter est CFPropertyListWriteToStream () . Le code de CoreFoundation est disponible à partir de Apple ( tarball ), entre autres.

Enfin, en fonction de la fréquence de mise à jour du fichier, du nombre de processeurs disponibles sur le serveur et du nombre de répétitions de vos données, il vous restera peut-être une amélioration significative à apporter. Par défaut, certains éléments des plists binaires sont uniques (tels que des chaînes). Les autres éléments ne le sont pas (tels que les tableaux et les dictionnaires). Le format de plist binaire leur permet d'être uniques, le problème est qu'il est coûteux de parcourir réellement des tableaux et des dictionnaires uniques. Si vous avez beaucoup de tableaux ou de dessins identiques dans votre contenu, il est possible que vous constatiez une réduction de taille significative en les unifiant. Vous pouvez l'activer en piratant _flattenPlist () dans CFBinaryPlist. c .

Si vous le faites, assurez-vous de le tester de manière approfondie, et ne le faites pas sur les fichiers que vous ne pouvez pas mettre à jour sur le réseau, juste au cas où une version ultérieure apporte des optimisations qui ne fonctionneraient pas. Assurez-vous également que vous êtes prêt à l'éteindre à tout moment.

Autres conseils

Il existe une implémentation PHP et Ruby pour cela:

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

L'implémentation Ruby liée est Ruby 1.9 uniquement. J'ai créé un sérialiseur binaire rapide qui fonctionne en Ruby 1.8.

http://gist.github.com/303378

Il n'est pas clair si vous souhaitez effectuer la conversion sur l'iPhone ou sur le serveur. Si c'est sur le serveur et que vous pouvez utiliser les frameworks Cocoa, le NSPropertyListSerialization fournit des services permettant de convertir les types de plist pris en charge (chaîne, XML et binaire) sur OS X (depuis 10.2). Il existe également des méthodes analogues dans la bibliothèque Core Foundation si vous préférez l’utiliser à la place.

Pour convertir une plist XML en une plique:

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

Voir Guide de vérification de la liste des propriétés sur developer.apple.com pour plus d'informations.

Outil de ligne de commande plutil - utilitaire de liste de propriétés

Apple dispose de deux très bons outils de ligne de commande pour modifier les fichiers de liste de propriétés.

  • / usr / libexec / Plistbuddy - pour les plists d'édition
  • / usr / bin / plutil - vérification de la syntaxe et conversion de type

Extrait de la page de manuel de plutil:

  

plutil peut être utilisé pour vérifier la syntaxe des fichiers de liste de propriétés, ou pour convertir        un fichier plist d'un format à un autre. Spécification - en tant que fichier d'entrée        lit à partir de stdin.

Conversion d'un plist existant au format XML, binaire ou JSON

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

Il existe une implémentation Perl aussi appelée Data :: Plist

La joyau binary_plist d'ajouter le plist en tant que format de réponse valide pour les contrôleurs Rails semble prometteuse.

Il y a quelques jours, j’avais rencontré des problèmes de mise en réseau avec les données binaires Plist dans iOS. Ce Gist est destiné à résoudre le problème simplement: Convertisseur Plist écrit en Swift

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top