尝试从Python(w/PyObjC)写入二进制plist格式,以便Cocoa Touch获取并读入

2024-10-01 07:42:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为我的iPhone应用程序提供搜索结果的属性列表。服务器是一个用Python编写的原型。在

首先,我发现了Python内置的plistlib,这太棒了。我想在您键入快照时提供搜索,所以我需要它尽可能小,而xml太大了。二进制plist格式似乎是个不错的选择。不幸的是,plistlib不处理二进制文件,所以直接使用PyObjC。在

(塞格:对于如何实现实时搜索,我非常愿意接受任何其他想法。我已经尽可能地缩减了数据,包括只显示足够的结果来填充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 objects dir()列表中。我也应该把列表转换成NSArray。我试过PyObjC文档,但它与我的实际工作太不相干了,所以我想我也应该试试sosos。在

^{pr2}$

这就是我在iPhone上阅读plist的方式。在

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

很高兴澄清,如果这些都没有道理。在


Tags: path应用程序format列表data二进制pyobjcplist
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)

如果测试结果文件,您将看到它是一个二进制PList文件,如所需:

^{pr2}$

我相信正确的函数名是

NSPropertyListSerialization.dataWithPropertyList_format_options_error_

因为结尾:

(顺便说一句,如果对象始终是数组或字典,-writeToFile:atomically:将已经编写plist(以XML格式)

相关问题 更多 >