コアデータでマジカルレコードを使っています。
私のアプリには、いくつかの文字列属性を持つエンティティが 1 つだけあります。今、このエンティティに画像を追加したいのですが、魔法の記録を使用してそれを行う方法がわかりません。検索しましたが、ウェブ上で何も見つかりませんでした。私のアプリでは、すべてのデータがユーザーによって挿入され、画像、カメラまたは写真ライブラリによっても挿入されます。
Magical Record と Core Data を使用して画像を保存するにはどうすればよいですか?
コアデータでマジカルレコードを使っています。
私のアプリには、いくつかの文字列属性を持つエンティティが 1 つだけあります。今、このエンティティに画像を追加したいのですが、魔法の記録を使用してそれを行う方法がわかりません。検索しましたが、ウェブ上で何も見つかりませんでした。私のアプリでは、すべてのデータがユーザーによって挿入され、画像、カメラまたは写真ライブラリによっても挿入されます。
Magical Record と Core Data を使用して画像を保存するにはどうすればよいですか?
画像をアプリのドキュメント フォルダーに保存し、コア データ エンティティにファイルの URL を含む文字列を保存するだけです。
私は私の答えを見つけました:
保存する:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString*nomeImmagine = [[NSString alloc] initWithFormat:@"%@", self.fieldName.text];
NSString *pngFilePath = [NSString stringWithFormat:@"%@/%@.png",documentsDirectory, nomeImmagine];
UIImage *image = self.showSelectedImage.image; // imageView is my image from camera
NSData *data1 = [NSData dataWithData:UIImagePNGRepresentation(image)];
[data1 writeToFile:pngFilePath atomically:NO];
ロードするには:
-(void) loadImageFromPathInsideView
{
// [self loadImageFromPathInsideView];
Ricetta* contact =[[DataManager sharedClass]dammiTuttaLaRicetta:self.indice];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString*nomeImmagine = [[NSString alloc] initWithFormat:@"%@", contact.nome2];
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [NSString stringWithFormat:@"%@/%@.png",documentsDirectory, nomeImmagine];;
UIImage* image = [UIImage imageWithContentsOfFile:path];
self.image.image = image;
}
一言アドバイス。画像をtransformable
(aka NSImage
) タイプとしてコア データに保存するのは簡単ですが、平均 100k で 50k から 200kb の範囲の小さな数 (20 以上) でもアプリのパフォーマンスが全体的に遅くなります。あるコントローラーが別のコントローラーにバインドされることが多いことを考えると、関係を介してそれらのファイルをリンクしても遅くなります。
Documents フォルダーを指すようにローカル パス名を保存する上記の方法はNSString
、全体的なエクスペリエンスにとって非常に優れています。
そうは言っても、(約 150x150 の) サムネイル画像を作成することはtransient
transformable
NSImage
、biggy をロードしてその場で何度もサイズ変更を行うよりも、一度作成してそれを として保存する方が有利な場合があります。そのパフォーマンスは、50 以上のサムネイル画像を保持するテーブルを上下にスクロールすることで簡単に確認できます。
上記で試したことは簡単に実行できます。私があなたにできる最善のアドバイスは、CoreData
データベースから画像を保存して取得するためだけに新しいサンプル プロジェクトを作成することです。そうすれば、プロセスがどのように機能するかを正確に知ることができます。この機能を現在のプロジェクトに埋め込もうとすると、何がどこで起こっているのか分からなくなる可能性があります。
これは非常に簡単な例です。デリゲートを .h ファイルに自分でインポートするなどしてください。
最初にUIImagePicker
経由ボタンを開始します
-(IBAction)pickImage:(id)sender
{
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
[self presentModalViewController:imagePicker animated:YES];
}
画像が選択されると、デリゲート メソッドの 1 つを使用してボタンに表示できます。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)selectedImage editingInfo:(NSDictionary *)editingInfo
self.imageButton.imageView.image = selectedImage;
それを保存して、データベースの属性のタイプにタイプをCoreData
割り当ててから保存するにはUIImage
Transformable
managedObjectContext
役立つリンク:
この助けを願って、頑張ってください!