私が取り組んでいる新しいアプリケーションのデータ構造を設計しようとしています。コアデータを初めて使用しています。"int"の配列をコアデータにシリアライズ
私は、コアデータの配列の欠如に取り組むのに少し苦労しましたが、私は主に問題を解決しました。
私が残した1つの問題は、オブジェクトタイプの1つに「int」の配列があることです。私はこれらのintの多くを持っているかもしれないので、私は彼らがスペース効率的であることを望みます。私はまた、すぐにそれらにアクセスできるようにしたい。
私の特定のケースでは、intの配列には2つの操作しか実行されません。一つはそれらを反復すること、もう一つは新しいintを追加することです。最も一般的な操作(および私が最も効率的に保つ必要がある操作)は、配列内のすべての値を読み取ることができるだけです。
保存するには、オブジェクトに「バイナリデータ」属性を使用する必要があることがわかります。今私はバイトの配列に "int"をパックする最良の方法を理解しようとしています。
私のアプリは、今のところiOSデバイスでのみ使用されるデータを作成する予定ですが、将来は他のマシンで使用される可能性があるため、私のソリューションはアーキテクチャに依存しませんが、低速プロセッサを搭載し、バッテリ寿命に懸念があるiOSデバイスでは最速です。
私は現在、intが "リトルエンディアン"形式で格納されるようにバイナリデータを設計するつもりです。私のオブジェクトは、NSManagedObjectのサブクラスであり、サイドフィールド(コアデータストレージの一部ではありません)は、値を反復処理するために使用する "int *"ポインタです。
オブジェクトがメモリにフォールトされると、私はc配列を初期化します。エンディアンは、(私はCFByteOrderGetCurrent()を使用して決定するであろう)「リトルエンディアン」であれば、私はこのようなコードで非常に効率的にintの配列を読むことができます:エンディアンがリトルエンディアンではない場合
@property (retain) NSData *data; // Core Data binary attribute
...
int *cArray = (int *) [self.data bytes];
、ローカルストレージを割り当て、int値を適切にアンパックし、バイナリ属性とc-arrayの両方を変更して最新に保つ必要があります。
フォルトを管理するためにサブクラスにコードを追加します(フォールトアウト時にcArrayをゼロにし、フォールト時に正しく設定する)。
私は本当に好きではありませんが、私にはうまくいくソリューションがあると思います。
私がしようとしていることを誰かがより良い方法で考えることができるなら、本当に感謝します。
また、c-arrayとNSDataまたはコアデータとのやりとりが私に問題を引き起こす原因を誰かが考えることができれば、本当にありがたいです。
おかげで、 ロン
詳細な回答をいただきありがとうございます...良いアドバイスがたくさん! – Ron
TC ...もう少し簡単な質問です。上記のコードは、バイナリデータのコピーを作成し、それをオートレースします。私はこれが上記のNSDataオブジェクトの値でコアデータが行うことを信頼しないというあなたのコメントのためだと思いますか? NSDataのCore Dataのコピーが少なくともオートリリースプールの長さで生き残ることは安全だとは思いませんか? – Ron
'copy'は一般に、不変オブジェクトの場合は' retain'と同じですが、反復処理中にオブジェクトのデータを変更した場合は*です。 'a = self.data; self.data = b; do_something_with(a.bytes) 'は完全にクラッシュする権利があります。反復中に 'data'を変更しないと、コピー/オートレリースをスキップすることは安全ですが、パフォーマンスの差はごくわずかです。 –