20

大規模な XML ベースのデータ セットを iPhone アプリに読み込む場合は、バイナリ plist 形式を使用することを強くお勧めします。彼らの理由の 1 つは、iPhone では XML の解析が非常に負担が大きいという事実です。ただし、これには、リモート Web サーバーにあるファイルを最初に変換する必要があります。

頻繁に変更されるコンテンツの場合、これを手動で行うことはできません。可能であれば、Web ベースのアプリがコマンド ラインを呼び出して変換を実行すること (つまり、plutil) を避けたいと思います。

この変換を実行するために公開されているアルゴリズムはありますか?

4

9 に答える 9

17

はい。すべての plist コードは、オープンソースである CoreFoundation の一部です。CoreFoundation は Linux と Windows で直接ビルドして実行できるため、Mac OS X で使用する通常の API を使用して CF ツールを作成し、他のプラットフォームでビルドして実行できます。

確認したい特定の API はCFPropertyListWriteToStream()です。CoreFoundation のコードは、Apple ( tarball ) などから入手できます。

最後に、ファイルを更新する頻度、サーバー上でどれだけのプロセッサを確保する必要があるか、およびデータの反復回数に応じて、実行できる重要な拡張機能が 1 つ残っている場合があります。デフォルトでは、バイナリ plist の特定の要素 (文字列など) は一意です。他の要素はそうではありません (配列や辞書など)。バイナリ plist 形式では、それらを一意にすることができます。問題は、実際にウォークスルーし、一意の配列と辞書を使用するのにコストがかかることです。コンテンツに同一の配列または dict が多数ある場合は、それらを一意にすることでサイズが大幅に縮小されることがあります。CFBinaryPlist.c の_flattenPlist () をハックすることで有効にできます。

それを行う場合は、非常に徹底的にテストしてください。将来のリリースでそれを破る最適化が行われる場合に備えて、ネットワーク経由で更新できないファイルには実行しないでください。また、すぐにオフにする準備ができていることを確認してください。

于 2008-11-05T06:39:10.620 に答える
14

そのための PHP と Ruby の実装があります。

http://code.google.com/p/cfpropertylist/

于 2009-12-06T18:55:25.447 に答える
7

リンクされた Ruby の実装は Ruby 1.9 のみです。Ruby 1.8 で動作するクイック バイナリ シリアライザを作成しました。

http://gist.github.com/303378

于 2010-02-13T11:28:06.110 に答える
6

変換を iPhone で行うか、サーバーで行うかは明確ではありません。サーバー上にあり、Cocoa フレームワークを使用できる場合、NSPropertyListSerializationOS X (10.2 以降) でサポートされている plist タイプ (文字列、XML、およびバイナリ) 間で変換するサービスが提供されます。代わりにそれを使用したい場合は、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
    }
}

詳細については、developer.apple.com のProperty List Pramming Guideページを参照してください。

于 2008-11-05T06:38:45.770 に答える
3

Data::Plistと呼ばれる Perl 実装もあります 。

于 2010-04-16T05:14:30.460 に答える
1

Rails コントローラーの有効な応答形式として plist を追加するbinary_plist gemは有望に見えます。

于 2011-06-12T06:16:55.477 に答える
-1

JavaSpringフレームワークソリューション

于 2012-11-15T05:42:22.827 に答える