私はコアデータを使用するアプリプロジェクトの真っ最中です。ここでは、に関してのみKVCを厳密に使用していNSManagedObjects
ます。結果としてそれを行う目的は、単に長所と短所を理解することです。私は不利な点を発見したかもしれません。しかし、その理由は説明できません。
これは、ユーザーが指で描いたスケッチ(ドキュメントへの署名)をコアデータに保存し、PDFにそれぞれフェッチして表示または印刷するという、非常に確立された原則(他のアプリですでに使用されている)を使用したときに発生しました。後でそれ。
UIImage
ビューから取得し、コアデータに保存し、KVC(間に保存/フェッチなし)を使用してコアデータからすぐに受信し、テスト目的で別のビューに表示することができたことがわかりました。しかし、実際に保存して、永続ストレージからデータをフェッチし、画面に再表示することはできませんでした。それで、私はたくさんのデバッグを行い、sqliteファイルなどを分析しました。最終的に、私はそれを次の奇妙な振る舞いに釘付けにしました:
状況:次のようにすることで、イメージがコアデータに正常に保存されました。
[self.detailItem setValue:UIImagePNGRepresentation(image) forKey:kSignatureImage];
オブジェクトでありimage
、です。キーとリファレンス、そしてすべてが問題ありません。UIImage
self.detailItem
NSManagedOBject
次に、ビューを再度表示することになります。以下は、コンテキストが間に保存されたかどうか、またはアプリが閉じられて再起動されたかどうかとは無関係です。
self.signatureCanvas.image = [UIImage imageWithData:[self.detailTextLabel valueForKey:kSignatureImage]];
サブクラスオブジェクトをself.signatureCanvas
ビーイングします。UIImageView
画像は画面に表示されません。
NSData *data = [self.detailItem valueForKey:kSignatureImage];
NSLog(@"UIImage a: %@", [UIImage imageWithData:[self.detailTextLabel valueForKey:kSignatureImage]]);
NSLog(@"UIImage b: %@", [UIImage imageWithData:data]);
self.testImage.image = [UIImage imageWithData:[self.detailTextLabel valueForKey:kSignatureImage]];
self.signatureCanvas.image = [UIImage imageWithData:data];
self.testImage
同じビュー(ただし小さい)の2番目のプレーンUIImageViewです。これで、画像はに表示されますが、には表示されsignatureCanvas
ませんtestImage
。(その逆の可能性があります、それを試しました)
出力は、何が起こっているかについてのヒントを提供しますが、実際の説明はありません。
2013-03-22 12:43:37.746 MyApp[1595:c07] UIImage a: (null)
2013-03-22 12:43:37.769 MyApp[1595:c07] UIImage b: <UIImage: 0x7c973a0>
これまでは、コードの行は少し同等であり、コンパイラーがデータオブジェクトを最適化することさえできると思っていました。しかし、なぜ一方のケースでは画像(null)
であり、もう一方のケースではそうではないのですか。
そこで、問題の根本原因と回避策を見つけました。したがって、これはもはや緊急ではありません。しかし、私はそれを理解していません。手がかりはありますか?
環境は次のとおりです。SDK6.1、xcode 4.6、ARC、sqliteのコアデータ、これまでのところiPadのみ。これはすべて、UITableViewControllerサブクラスのUITableViewCellサブクラス(ストーリーボード内のプロトタイプセル)で自然に発生します。