Попытка записи в двоичный формат plist из Python (w / PyObjC) для извлечения и считывания с помощью Cocoa Touch - PullRequest
3 голосов
/ 27 февраля 2010

Я пытаюсь отправить список свойств результатов поиска в приложение для iPhone. Сервер является прототипом, написанным на Python.

Сначала я нашел встроенный в Python plistlib, который просто потрясающий. Я хочу сделать снимок типа «поиск при вводе», поэтому мне нужно, чтобы он был как можно меньше, а xml был слишком большим. Бинарный формат plist кажется хорошим выбором. К сожалению, plistlib не работает с бинарными файлами, поэтому перейдите прямо к PyObjC.

(Segue: я очень открыт для любых других мыслей о том, как выполнить поиск в режиме реального времени. Я уже максимально сократил данные, включая только отображение достаточного количества результатов, чтобы заполнить окно с клавиатурой iPhone вверх, что 5.)

К сожалению, хотя я знаю Python и неплохо отношусь к Какао, я все еще не получаю PyObjC.

Это какао-эквивалент того, что я хочу сделать:

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];

Я думал, что смогу сделать что-то подобное, но dataWithPropertyList отсутствует в списке dir () объектов NSPropertyListSerialization. Я должен также, вероятно, преобразовать список в NSArray. Я попробовал документы PyObjC, но это настолько касательно моей реальной работы, что я решил попробовать и SO SOS.

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,
    ?,
    ?)

Вот как я читаю в листе со стороны iPhone.

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

С удовольствием уточню, если это не имеет смысла.

Ответы [ 2 ]

4 голосов
/ 27 февраля 2010

Я считаю, что правильное имя функции

NSPropertyListSerialization.dataWithPropertyList_format_options_error_

из-за окончания :.

(Кстати, если объект всегда является массивом или словарем, -writeToFile:atomically: уже запишет список (в формате XML).)

2 голосов
/ 12 марта 2010

Как сказал KennyTM, в названии метода пропущено завершающее подчеркивание. В PyObjC вам нужно взять имя селектора Objective-C (dataWithPropertyList:format:options:error:) и заменить все двоеточия подчеркиванием (не забывайте также и о последнем двоеточии!). Это дает вам dataWithPropertyList_format_options_error_ (обратите внимание на конечное подчеркивание). Также для параметра error вы можете просто использовать None. Это делает ваш код похожим на это:

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)

Если вы протестируете полученный файл, вы увидите, что это файл Binary PList, как вам нужно:

Jagaroth:~/Desktop $ file test.plist 
test.plist: Apple binary property list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...