2012-03-27 7 views
6

背景:私は管理対象オブジェクトCarを持っています。私は、ローカルホスト/車/検索に座っているRESTful検索APIを持っています。返される結果は、サーバー側からのCarオブジェクトですが、ユーザーが選択したものだけを保存します。残りの車は私が検索から外れると捨てたいものです。コアデータを持つRestKitの一時オブジェクトのベストプラクティス

最初に私はすべてのようだった:

@interface Car : NSManagedObject //<--- managed object 

    @property (nonatomic, strong) NSNumber* year; 
    @property (nonatomic, strong) NSString* make; 
    @property (nonatomic, strong) NSString* model; 

@end 

@interface TransientCar : NSObject //<--- regular NSObject! 

    @property (nonatomic, strong) NSNumber* year; 
    @property (nonatomic, strong) NSString* make; 
    @property (nonatomic, strong) NSString* model; 

@end 

私は、検索結果を表示するが、コンテキストにそれらを保存しない目的のためにTransientCarオブジェクトにREST API検索結果のJSONをマッピングしました。デフォルトでは、管理オブジェクトをマップすると、RestKitは+オブジェクト簡易ファクトリを呼び出してオブジェクトを作成し、現在のコンテキストに挿入します(sharedManagerのオブジェクトストアのコンテキストbtw!にハードコードされます)。

これは持続不可能でした。これは良い習慣です

RKObjectMapping* tempCarMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]]; 
[tempCarMapping mapKeyPathsToAttributes: 
@"year", @"year", 
@"make", @"make", 
@"model", @"model", 
nil]; 

:だから今私は、ユーザーが詳細ビューにタップし、ため、実際の管理対象オブジェクトを保存する価値が何かをするまで、検索結果データを保持するためにNSMutableDictionaryを使用していますか? NSMutableDictionaryを一時的な表現として使用すると、新しいオブジェクトをコンテキストに挿入する必要があります。私は、オリジナルの管理対象サブクラスを使ってデータを表現するファンだったのですが、何らかの形で「保持しない」というフラグを立てることができましたが、そのたびにフレームワークと戦っているような気がします(および競合状態)。私はまた、新しいRKObjectManagerを作成し、ちょうどその後その全体の文脈をクリアすることによってスクラッチ/使い捨てコンテキストを使用してみましたが、RestKitのActiveRecordのカテゴリの+ managedObjectContextメソッドが返すようにハードコードされています。ソートのこれまで使用しての可能性をscuttles

[[[RKObjectManager sharedManager] objectStore] managedObjectContext]; 

一時/ごみデータのスクラッチコンテキスト。

答えて

3

最初に、モデルのコピーを2つ持つ方法を使用してこれを行っています.1つはコアデータ用、もう1つは一時的(NSObjectのみ)です。それは私のために何の問題もなく働いた。

あなたの他の試みは、図書館が思うようにあなたの手を強く動かすとは思わない。 RKManagedObjectStoreNSManagedObject+ActiveRecordのAPIを見てください。特に、RKManagedObjectStoreはmanagedObjectContextプロパティ、メソッド- (NSManagedObjectContext*)newManagedObjectContext、および変更をマージするいくつかのメソッドを持っています。

あなたは正しく、[NSManagedObject managedObjectContext]はsharedManagerのコンテキストを返しますが、それは意味があり、クラスメソッドです。それ以外の場合、クラスはどのコンテキストを返すのかをどのように知るでしょうか?しかし、それは新しいコンテキストを作成し、それらにアクセスする他の多くの方法があるので、問題はありません。あるいは、それをあまり避けることで、あなたは一時的な文脈への参照を保持し、それを直接使うことができます。

これは、複数のObjectManagerを持ち、1つのオブジェクトマネージャを持ちますが、そこから一時的なコンテキストを作成し、必要なオブジェクトのみを保持し、管理対象オブジェクトに基づいて一時オブジェクトを作成します。

NSMutableDictionaryオプションは他のメソッドほど柔軟ではありませんが、「悪い習慣」とは言いません。

+0

NSObjectから継承したモデルクラスが正常ですが、私の最大の関心事は、NSManagedObjectバージョンで過渡モデルを最新の状態に保つことです。それは技術的なものよりもコードの保守性に関する懸念のほうが多いです。エディタ> Generate NSManagedObjectサブクラスに「NSObjectサブクラスをミラーリングしました」というチェックボックスが表示されています。 –

+0

確かに、あなたのモデルがどんな頻度でも変化するならば、私が概説した他の方法の一つが良い選択になるでしょう。 –

5

残念ながら、この回答を(別の返信にコメントとして)載せるのに十分なStackOverflow評判はまだありませんが、いくつかの点を追加したいと思います。

私はEvan Cordellの答えに欠陥があると信じています。現在のRestkitバージョン(0.10.x)では、RKManagedObjectLoadersが使用するコンテキストを作成することはできず、RKObjectManagersはストアを取ることができますが、明示的にsqlliteに関連付けられたRKManagedObjectStoreタイプでなければなりません。デベロッパー版のrestkit(0.20)はそれを緩和するように見えるので、データをメモリ内のデータベースに保存することができます。私は、私が提供したコンテキストを使うためにRKManagedObjectStoreメソッドをオーバーライドしようとしましたが、うまくいきませんでした...どんな速度でも、修正は簡単ではないようです。

他のリンクBetter Approach for Creating Temp Object for Core Data with Restkitは、オブジェクトをポストし、同じオブジェクトをレスポンスで受け取ることと同じように見えます。この問題で提起された問題とは異なる問題です。

v.0.20.xがリリースされるまでは間に合うはずですが、並列クラス階層が唯一の選択肢であるようです。私が間違っているなら、私はこの点について訂正を歓迎する!

+0

RestKitは頻繁に変更され、サポートするものを理解する最良の方法は、ドキュメントをチェックすることです。しかし1.0以降はあまり変わってはいけません。現在、永続的なストアコーディネータを使用してRKManagedObjectStoreを作成し、自由にコンテキストを追加/削除する方法があります。 –

関連する問題