2010-02-27 26 views
3

我試圖將搜索結果的屬性列表提供給我的iPhone應用程序。服務器是一個用Python編寫的原型。嘗試從Python(w/PyObjC)寫入二進制plist格式以獲取並由Cocoa Touch讀取

首先我發現了Python的內置plistlib,這很棒。我想給你一個類型的搜索,所以我需要它儘可能小,而xml太大了。二進制plist格式似乎是一個不錯的選擇。不幸的是,plistlib不會執行二進制文件,因此請立即調用PyObjC。 (Segue:我對任何關於如何完成實時搜索的想法都很開放,我已經儘可能地減少了數據,包括只顯示足夠的結果來填充iPhone鍵盤的窗口,是的。)

不幸的是,儘管我知道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, 
    ?, 
    ?) 

這就是我在iPhone上閱讀plist的方式。

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 2010-02-27 08:20:11

+0

@zekel:XML格式(除非設置了'NSWriteOldStylePropertyLists'環境變量)。 – kennytm 2010-02-27 08:30:55

+0

它看起來不像NSWriteOldStylePropertyLists是與二進制格式相同的東西。它是「指定文本屬性列表輸出是否應該採用默認的MacOS-X格式(XML),或者是更易讀的(但功能更強大)原始OpenStep格式。」 – zekel 2010-03-01 21:51:36

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 
相關問題