Bri*_*ine 20 iphone cocoa-touch objective-c plist core-foundation
Apple强烈建议在将大型基于XML的数据集读入iPhone应用程序时使用二进制plist格式.他们的理由是,XML解析对iPhone非常重要.但是,这要求首先转换驻留在远程Web服务器上的文件.
对于频繁更改的内容,手动执行此操作是不可接受的.如果可能的话,我想避免让基于Web的应用程序调用命令行来执行转换(即plutil).
是否有公开的算法来执行此转换?
Lou*_*arg 17
是.所有plist代码都是CoreFoundation的一部分,它是开源的.CoreFoundation可以直接在Linux和Windows上构建和运行,因此您可以使用在Mac OS X上使用的普通API编写CF工具,但可以在其他平台上构建和运行它.
您要查看的特定API是CFPropertyListWriteToStream().CoreFoundation的代码可以从Apple(tarball)等地获得.
最后,根据您更新文件的频率,服务器上需要多少处理器,以及您的数据重复次数,可能会有一个重要的增强功能.默认情况下,二进制plist中的某些元素是唯一的(例如字符串).其他元素不是(例如数组和字典).二进制plist格式允许它们是唯一的,问题是实际遍历并且独特的数组和字典是昂贵的.如果您的内容中有许多相同的数组或词组,则可以通过单独使用来显着减小大小.您可以通过在CFBinaryPlist.c中修改 _flattenPlist()来启用它.
如果你这样做,请确保非常彻底地测试它,并且不要对任何无法通过网络更新的文件进行测试,以防将来的版本进行任何优化以破坏它.此外,请确保您已准备好立即关闭它.
目前尚不清楚是否要在iPhone或服务器上进行转换.如果它在服务器上并且您可以使用Cocoa框架,则NSPropertyListSerialization
提供服务以在OS X上自支持的plist类型(字符串,XML和二进制)之间进行转换(自10.2起).如果你更愿意使用它,那么Core Foundation库中也有类似的方法.
要将XML plist转换为二进制plist:
NSString *xmlPlistPath; // already set
NSString *outPath; // already set
NSData *plistData;
NSString *error;
NSPropertyListFormat format;
id plist;
plistData = [NSData dataWithContentsOfFile:xmlPlistPath];
plist = [NSPropertyListSerialization propertyListFromData:plistData
mutabilityOption:NSPropertyListImmutable
format:&format
errorDescription:&error];
if(plist == nil) { // unable to parse plist
//deal with failure -- error gives description of the error
} else {
binaryPlistData = [NSPropertyListSerialization dataFromPropertyList:plist
format:NSPropertyListBinaryFormat_v1_0
errorDescription:&error];
if(binaryPlistData == nil) {//unable to create serialized plist
// deal with failure -- error gives description of the error
}
if(![binaryPlistData writeToFile:outPath atomically:YES]) {
// unable to write file
}
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅developer.apple.com上的Property List Pramming Guide页面.
归档时间: |
|
查看次数: |
15104 次 |
最近记录: |