【问题标题】:Trying to write to binary plist format from Python (w/PyObjC) to be fetch and read in by Cocoa Touch尝试从 Python (w/PyObjC) 写入二进制 plist 格式以由 Cocoa Touch 获取和读取
【发布时间】:2010-02-27 06:34:47
【问题描述】:

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

首先我发现了 Python 的内置 plistlib,非常棒。我想在输入时进行搜索,所以我需要它尽可能小,而 xml 太大了。二进制 plist 格式似乎是一个不错的选择。不幸的是 plistlib 不做二进制文件,所以请直接使用 PyObjC。

(Segue:我对如何完成实时搜索的任何其他想法都持开放态度。我已经尽可能地减少了数据,包括只显示足够的结果来填充 iPhone 键盘向上的窗口,这是5.)

不幸的是,虽然我知道 Python 并且在 Cocoa 方面做得相当不错,但我仍然没有得到 PyObjC。

这是我想做的 Cocoa 等价物:

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 对象 dir() 列表中。我也应该将列表转换为 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 端的 plist 中的阅读方式。

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

很高兴澄清这是否有任何意义。

【问题讨论】:

    标签: python cocoa-touch search pyobjc


    【解决方案1】:

    我相信正确的函数名是

    NSPropertyListSerialization.dataWithPropertyList_format_options_error_
    

    因为结尾:

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

    【讨论】:

    • -writeToFile:atomically可以使用二进制plist格式吗?而且我实际上并不想将其写入磁盘,我需要将其打印出来以供 HTTP 响应。
    • @zekel:XML 格式(除非设置了NSWriteOldStylePropertyLists 环境变量)。
    • 它看起来不像 NSWriteOldStylePropertyLists 和二进制格式一样。它是“指定文本属性列表输出应该是默认的 MacOS-X 格式 (XML),还是更易于阅读(但功能较弱)的原始 OpenStep 格式。”
    【解决方案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 文件,正如您所愿:

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

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多