2010-02-27 7 views
3

J'essaie de diffuser une liste de propriétés des résultats de recherche dans mon application iPhone. Le serveur est un prototype, écrit en Python.Essayer d'écrire au format binaire plist à partir de Python (w/PyObjC) pour être récupéré et lu par Cocoa Touch

D'abord, j'ai trouvé le plistlib intégré de Python, qui est génial. Je veux donner un coup-de-recherche-comme-un-coup, donc j'ai besoin qu'il soit aussi petit que possible, et xml était trop grand. Le format de plist binaire semble être un bon choix. Malheureusement, plistlib ne fait pas de fichiers binaires, alors passez directement à PyObjC.

(Segue: Je suis très ouvert à toute autre idée sur la façon d'effectuer une recherche en direct.J'ai déjà réduit les données autant que possible, y compris afficher uniquement des résultats suffisants pour remplir la fenêtre avec le clavier de l'iPhone, est 5.)

Malheureusement, bien que je connaisse Python et que je devienne plutôt correct avec Cocoa, je n'ai toujours pas PyObjC.

Ceci est l'équivalent de cacao de ce que je veux faire:

NSArray *plist = [NSArray arrayWithContentsOfFile:read_path]; 
NSError *err; 
NSData *data = [NSPropertyListSerialization dataWithPropertyList:plist 
        format:NSPropertyListBinaryFormat_v1_0 
        options:0 // docs say this must be 0, go figure 
        error:&err]; 
[data writeToFile:write_path atomically:YES]; 

Je pensais que je devrais être en mesure de faire quelque chose comme ça, mais dataWithPropertyList est pas dans les objets NSPropertyListSerialization liste dir(). Je devrais probablement convertir la liste en NSArray. J'ai essayé les docs de PyObjC, mais c'est tellement tangentiel à mon vrai travail que j'ai pensé que j'essaierais un SO SOS, aussi.

from Cocoa import NSArray, NSData, NSPropertyListSerialization, NSPropertyListBinaryFormat_v1_0 
plist = [dict(key1='val', key2='val2'), dict(key1='val', key2='val2')] 
NSPropertyListSerialization.dataWithPropertyList_format_options_error(plist, 
    NSPropertyListBinaryFormat_v1_0, 
    ?, 
    ?) 

C'est ainsi que je lis dans le plist du côté de l'iPhone.

NSData *data = [NSData dataWithContentsOfURL:url]; 
NSPropertyListFormat format; 
NSString *err; 
id it = [NSPropertyListSerialization 
     propertyListFromData:data 
     mutabilityOption:0 
     format:&format 
     errorDescription:&err]; 

Heureux de préciser si cela n'a aucun sens.

Répondre

4

je crois que le nom de la fonction est

NSPropertyListSerialization.dataWithPropertyList_format_options_error_ 

en raison de la fin :.

(BTW, si l'objet est toujours un tableau ou un dictionnaire, -writeToFile:atomically: va écrire le plist (au format XML) déjà.)

+0

Peut -writeToFile: atomiquement utiliser le binaire format de plist? Et je ne veux pas vraiment l'écrire sur un disque, j'ai besoin de l'imprimer pour la réponse HTTP. – zekel

+0

@zekel: format XML (sauf si la variable d'environnement 'NSWriteOldStylePropertyLists' est définie). – kennytm

+0

il ne semble pas que NSWriteOldStylePropertyLists soit la même chose que le format binaire. C'est "Spécifie si la sortie de liste de propriétés de texte doit être au format MacOS-X par défaut (XML), ou au format OpenStep original plus lisible par l'homme (mais moins puissant)." – zekel

2

Comme l'a dit KennyTM, vous manquez la fuite de soulignement dans le nom de la méthode. Dans PyObjC, vous devez prendre le nom du sélecteur Objective-C (dataWithPropertyList:format:options:error:) et remplacer tous les deux-points par des traits de soulignement (ne pas oublier le dernier deux-points, aussi!). Cela vous donne dataWithPropertyList_format_options_error_ (notez le trait de soulignement final). En outre, pour le paramètre error, vous pouvez simplement utiliser None. Cela rend votre code comme ceci:

bplist = NSPropertyListSerialization.dataWithPropertyList_format_options_error_(
            plist, 
            NSPropertyListBinaryFormat_v1_0, 
            0, 
            None) 

# bplist is an NSData object that you can operate on directly or 
# write to a file... 
bplist.writeToFile_atomically_(pathToFile, True) 

Si vous testez le fichier obtenu, vous verrez que c'est un fichier binaire plist, comme vous le souhaitez:

Jagaroth:~/Desktop $ file test.plist 
test.plist: Apple binary property list