ユーザーが自分のアカウントに画像を追加できるアプリケーションがあります。
(カメラまたはフォトライブラリから取得した)画像を保存する方法を知りたいコアデータを使用、ユーザーにバックアップ機能を提供している可能性があり、画像データをサーバ。
Image
モデルオブジェクトを作成し、User
モデルオブジェクトとの1対1の関係を作成するという設計上の提案に遭遇しました(必要な場合を除き、関連付けられたImageオブジェクトは呼び出されません) )。ただし、イメージを実際に格納する方法と、パフォーマンスの点でこれが潜在的に致命的かどうかはわかりません。
これを試みた人からのアプローチと落とし穴についてのアドバイスに感謝します。
Core Dataに画像データを保存するためのルールは以下の通りです:
ディスクに1 MBのストアを格納し、Core Dataストアのパスを参照します。
変換可能なデータ型を使用して、NSImageを直接Core Dataに保存できます。実際、変換可能なデータ型を使用して、NSCoderプロトコルを実装するあらゆるものを格納できます。
個人的には、この方法で多くの情報を失う可能性があるため、CGImageRefに変換しません。
この質問をしてから時間が経ちましたが、この問題に関する私の経験を共有したいと思います。
画像の数に制限がない場合、画像をDB内に保存することはお勧めしません。いつか新しいバージョンのデータモデルを追加し、アプリの更新時に古いDBから新しいDBに移行する必要があることに注意してください。時間がかかる。 DBファイルが大きいほど、移行に時間がかかります。
画像をDBに保存する場合は、UIApplicationDelegate
のapplication: didFinishLaunchingWithOptions:
メソッドに永続ストアを追加しないでください。 XX秒以内に移行が完了しない場合、iOSはアプリを終了します。
落とし穴:あなたは巨大な、扱いにくいsqliteデータベースになるかもしれません。ユーザーに数MBのファイルを1つのステップでサーバーにアップロードしてもらいたいですか?セルラー接続が数秒間途絶した場合、どうしますか?
Core Dataを使用して画像とそのアップロード状態(アップロード:はいまたはいいえ)を管理する方が良いと思います。このようにして、アプリケーションのワークフローに適合するときに画像をアップロードできます。さて、接続数が多いので、少し長持ちします。しかし、よりクリーンなアプローチだと思います...
ITunesについて考えるとき、バックアップについて言えば:ローカルのiPhoneの「ドキュメント」フォルダはとにかく同期されます。
あなたはaを持っている必要があります、そしてあなたはこのようなことをすることができます:
CGImageRef imageRef = uiImage.CGImage;
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);
NSData *imageData = (NSData*)CGDataProviderCopyData(dataProvider);
[managedObject setValue:imageData forKey:@"data"];
ここで、managedObjectはコアデータイメージオブジェクトであり、@ "data"はバイナリプロパティの名前です。後でイメージを逆シリアル化するために、イメージ形式を保存する必要がある場合もあります。
別のオプションは、イメージをディスクに保存し、パスをコアデータに保存することです。