代码之家  ›  专栏  ›  技术社区  ›  zekel lepture

尝试从python(w/pyobjc)写入二进制plist格式,以便通过cocoa touch获取和读取。

  •  3
  • zekel lepture  · 技术社区  · 15 年前

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

    首先,我发现了python的内置plistlib,非常棒。我想在您键入一个快照时进行搜索,所以我需要它尽可能小,而XML太大。二进制plist格式似乎是个不错的选择。不幸的是,plistlib不做二进制文件,所以请直接向上pyobjc。

    (塞格:我很愿意接受关于如何完成现场搜索的任何其他想法。我已经尽可能地减少了数据量,包括只显示足够的结果,让iPhone键盘向上填满窗口,即5)。

    不幸的是,虽然我认识巨蟒,而且对可可的了解也相当不错,但我还是没有得到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];
    

    我认为我应该可以这样做,但带有propertyList的数据不在nspropertyListSerialization objects dir()列表中。我也应该把清单转换成NSARRAY。我试过Pyobjc医生,但它与我真正的工作无关,我想我也试过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];
    

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   kennytm    15 年前

    我相信正确的函数名是

    NSPropertyListSerialization.dataWithPropertyList_format_options_error_
    

    因为结局 : .

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

        2
  •  2
  •   James Eagan    15 年前

    正如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