1

メモリ内で使用するモデル オブジェクトにカスタム ファイル形式をロードして解析するメカニズムを実装する方法について、一部の iOS Cocoa プログラマーからのガイダンスを探しています。この問題を解決するには多くの方法があるに違いないことは承知していますが、私が探求した現在の道の基本的な考え方と、行き詰まった場所を共有させてください。

しかし、最初に、コンテキストを示します。変更できない既存のファイル形式があるとします。これは基本的に、パイプで区切られたエキゾチックな形式で、さまざまなセクションに分かれており、それぞれが次のように始まります。

%n|sectionName

...そして、それに続く n 行はすべて、そのセクションに固有の方法でパイプで区切られています。一部のセクションにはパイプで区切られたヘッダー行があり、その後に n 行のデータ (これもパイプで区切られています) が続き、他のセクションにはパイプで区切られた n 行しかない場合があります。ファイルの先頭に向かっていくつかの短いセクションがあり、最後に k-ary ツリーのノードを説明する 1 つの巨大なセクションがあります: それらの親子関係と各ノードに関連付けられたデータです。これらのファイルのサイズは数十メガバイトで、将来的にはさらに大きくなる可能性があります。

最後に、私は iOS プログラミングにかなり慣れていないということです。

を使用NSFileHandleして、ファイルの表現を のインスタンスとして取得することから始めましたNSData。これは非常に簡単で、NSDataインターフェイスを調べてそこから先に進む方法を試してみると、NSCodingプロトコルに気付きました。これは、オブジェクトを表現に (および表現から) アーカイブおよびシリアル化するための機能であると主張しています。

ファイル形式は、モデル オブジェクトをマーシャリングできる単なる表現であると考える傾向があるため、これは必要かもしれないと思いました。しかし、「Archives and Serializations Programming Guide」を掘り下げた後、私は自分自身を推測し始めました。この API は、私が達成しようとしていることに役立たないようです。

私はここで袋小路を下っていますか?代わりにサブクラス化しようとする必要がありNSInputStreamますか、それとも私が見逃している他のアプローチを取る必要がありますか?

4

4 に答える 4

3

NSCoding はおそらく間違ったアプローチです。これは、カスタム ファイル形式を解析するのではなく、Objective-C 型をシリアル化およびシリアル化解除するために設計されています。

おそらく、NSInputStream をサブクラス化する必要もありません。ここでの最善の策は、特にfgets行を読み取るために、おそらく C の stdio ライブラリを使用することです。本当に NSInputStream または NSFileHandle を使用したい場合は、文字列から各行を自分で解析する必要があります (実際にはそれほど難しくありません)。

于 2011-04-10T02:38:18.727 に答える
2

Ragelを使用してスマートな解析を処理することをお勧めします。NSScanner基本的な足場を整えてパーサーをセットアップし、パーサーが完了するまでバイトをフィードするよりもはるかに簡単です。

解析された結果を格納するために使用するオブジェクトは、あなた次第です。ステート マシンの遷移によってトリガーされるアクション関数を使用してオブジェクト グラフを作成するのは、それほど難しいことではありません。

どのようにバイトを取得して Ragel にフィードするかは、あなた次第です。C 標準 IO ストリーム、Foundation ストリーム、または Foundation ファイル ハンドルを使用できます。Ragel が関心を持っているのは、文字のバッファを取得して、記述がコンパイルされたステート マシンを介して実行できるようにすることだけです。

NSCoderあなたの目的にとって価値があるよりも多くの問題になる可能性があります。オブジェクトの要求によって駆動されるコーディング/デコードを使用して、Obj-C オブジェクトを永続化およびデコードする方法として使用されることを期待しています (「さて、int を与えてください。今は短い、Obj-C オブジェクトはどうですか… 」)。

于 2011-04-11T16:18:11.367 に答える
1

いくつかのオープン ソースの解析関連キットがあり、それぞれがわずかに異なる目的を対象としています。これらのいずれかがあなたにとって役立つか、まったく役に立たないかもしれませんが、あなたの質問に答えてそれらについて言及することは、少なくとも他の人にとっては役立つように思えます.

于 2011-04-12T21:14:40.167 に答える