4

UIManagedDocument の一部として、plist といくつかのバイナリ ファイル (画像としましょう) を保存しようとしています。バイナリ ファイルの名前は Core Data の属性であり、それらを列挙する必要はありません。関連するエンティティを表示するときに適切なファイルにアクセスするだけです。

私が持ちたいファイル構造は次のとおりです。

 - <File yyyyMMdd-HHmmss>.extdoc
   - StoreContent
     - persistentStore
   - AdditionalContent
     - ListStatus.plist (used to store per document defaults)
       - Images
         - uuid1.png
         - uuid2.png
         - ...
         - uuidn.png

これまでのところ、UIManagedDocument ファイル パッケージに追加のコンテンツを保存するにはどうすればよいですか?の指示に従って問題なく実行できました。、しかし、バイナリファイルを追加しようとすると、方法がわからないことがいくつかあります。

  1. URL /the/path/File yyyyMMdd-HHmmss.extdoc/ AdditionalContent (readAdditionalContentFromURL:error: で提供されるデフォルトの URL) を NSFileWrapperとして扱うべきですか? URL のみを使用する場合と比較して、利点/欠点はありますか? plist はファイル ラッパー アクセサーと NSCoder (推測) を使用して読み取る必要があるため、ファイル ラッパーを使用するのはより複雑だと思います。 objectForKey を持つノード (私は推測します)。しかし、Apple の Document-Based Apps Programming Guide for iOS では、NSData または NSFileWrapper の代わりにカスタム フォーマットに関して、「コードは UIDocument が行うことを複製する必要があることに注意してください。そのため、より複雑になり、エラーの可能性が高くなることに対処する必要があります。「私はこれを誤解していますか?
  2. ドキュメントごとのデフォルトはプロパティとして宣言されます。セッターは、plist をマップしてドキュメントを更新済みとしてマークする NSDictionary を変更し、ゲッターは適切なキーを使用して辞書にアクセスします。バイナリ ファイルの読み取り/書き込み機能を公開するにはどうすればよいですか? UIManagedDocument のサブクラスにメソッドを追加する必要がありますか? - (void)writeImage:(NSString*)uuid; および -(UIImage *)readImage:(NSString *)uuid; ドキュメントが保存されるまで、このデータをメモリに保持する必要がありますか? どのように?
  3. NSFileWrapper を使用すると仮定すると、iCloud でこのドキュメントを使用する場合、ファイル コーディネーターをファイル ラッパーで使用する必要がありますか? もしそうなら、どのように?

各質問のソース コードは大歓迎です。ありがとうございました。

PS: Core Data 内にバイナリ データを保存できることは知っていますが、その解決策には満足できません。他の理由の中でも特に、デスクトップ アプリを作成する場合は、NSImage と互換性のないシリアル化されたバージョンの UIImage である画像ファイルの PNG データを保存します。

4

3 に答える 3

1

私は、一般的に、UIManagedDocumentが好きだと言いたいです。生のコアデータに比べていくつかの利点があります。たとえば、コアデータスタック全体が自動的に設定されます。また、ネストされた管理対象オブジェクトコンテキストを設定するため、バックグラウンドで無料で保存できます。そのどれもが特に驚異的なものではありませんが、それは少量のコードからの多くの機能です。

私は追加情報を保存することをいじっていません...しかし、ここに私の考えがあります。

まず、新しいURLをファイルラッパーとして扱う必要はありません。提供されたURLで通常のファイル操作を実行できるはずです。additionalContentForURL:error:、writeAdditionalContent:toURL:originalContentsURL:error:、およびreadAdditionalContentFromURL:error:にすべてが正しく実装されていることを確認してください。読み取りと書き込みの操作は対称的である必要があります。また、おそらくデータをadditionalContentsForURL:error:でスナップショットして、すべてが既知の良好な状態で保存されるようにする必要があります(保存操作は非同期であるため)。

別の方法として、手動で保存する代わりに、データモデルで[外部レコードファイルに保存]フラグを使用することを検討しましたか?これにより、Core Dataは(バイナリデータのサイズに応じて)自動的に外部に保存されます。リリースノートを見ましたが、iCloudでこの機能を使用できないということは何もわかりませんでした。それが最も簡単な修正かもしれません。

于 2012-03-08T00:53:43.933 に答える
0

今のところサイドポイントを攻撃しています(私は良い経験がありませんでしUIManagedDocument

外部ファイル参照を使用して、iOS 5.0 以降のアプリケーションの Core Data 内にバイナリを保存できます。UIManagedDocument次に、画像の PNG を Core Data に直接保存でき、sqlite ファイルの肥大化について心配する必要はありません。

UIImage の代わりに PNG を保存することを妨げるものは何もありません。

于 2012-02-29T01:12:50.967 に答える
0

もう1つの考え。読み取り操作と書き込み操作に NSFileCoordinator を使用する必要がある場合があります。技術的には、iCloud コンテナー内のすべての読み取りまたは書き込み操作は、ファイル コーディネーターを使用する必要があります (iCloud 同期サービスと調整するためです。これにより、別のプロセスが書き込みを行っているときに誤ってファイルを読み取って破損するのを防ぐことができます)。

UIDocument はほとんどの入力メソッドと出力メソッドを自動的にラップすることを知っています。これらのメソッドは (使用する URL を提供するため) 同様にラップされていると思いますが、ドキュメントはあまり明確ではありません。

于 2012-03-08T01:23:46.967 に答える