2010-02-27 1 views
3

Я пытаюсь выполнить список свойств результатов поиска для своего iPhone-приложения. Сервер является прототипом, написанным на Python.Пытается записать в бинарный формат plist из Python (w/PyObjC), который будет извлечен и прочитан Cocoa Touch

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

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

К сожалению, хотя я знаю Python и получаю довольно приличный с Cocoa, я до сих пор не получаю 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 не в 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, 
    ?, 
    ?) 

Это как я читаю в plist на стороне iPhone.

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

Счастье, чтобы уточнить, нет ли в этом никакого смысла.

ответ

4

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

NSPropertyListSerialization.dataWithPropertyList_format_options_error_ 

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

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

+0

Может -writeToFile: атомарно использовать бинарный формат plist? И я на самом деле не хочу записывать его на диск, мне нужно распечатать его для ответа HTTP. – zekel

+0

@zekel: формат XML (если не задана переменная среды NSWriteOldStylePropertyLists). – kennytm

+0

не похоже, что NSWriteOldStylePropertyLists - это то же самое, что и двоичный формат. Он «Указывает, должен ли вывод текста свойств свойства должен быть в формате MacOS-X по умолчанию (XML) или в более читаемом (но менее мощном) оригинальном формате OpenStep для человека.» – zekel

2

Как сказал 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