私は、カスタムRESTFul APIとインターフェイスするアプリケーションを構築するために、iOS 5.0デプロイメントターゲットでCore Dataを持つRestKit 0.10.1を使用しています。オフライン接続が重要なので、デバイスのローカルCoreDataデータベースにユーザーのデータのキャッシュを保持しています。RestKit + CoreData:リモート保存が成功した後にオブジェクトをローカルに保存する方法はありますか?
RestKitはかなり素晴らしいですし、RKFetchResultsTableControllerをセットアップしてデータを簡単に表示して永続化させるのは簡単です。しかし、RestKitの動作は理想的ではなく、変更方法を理解できません。
「録音」というモデルがあります。新しい録音を作成するために、私は次のことをやっている:
Recording *r = [NSEntityDescription insertNewObjectForEntityForName:@"Recording" inManagedObjectContext:[[RKObjectManager sharedManager].objectStore managedObjectContextForCurrentThread]];
r.name = newName;
[[RKObjectManager sharedManager] sendObject:r toResourcePath:@"/recordings" usingBlock:^(RKObjectLoader *loader){
loader.delegate = self;
loader.method = RKRequestMethodPOST;
loader.serializationMIMEType = RKMIMETypeJSON;
loader.serializationMapping = [RKObjectMapping serializationMappingUsingBlock:^(RKObjectMapping *serializationMapping){
[serializationMapping mapAttributes:@"name", nil];
}];
RBMappingProvider *mappings = (RBMappingProvider *)[[RKObjectManager sharedManager] mappingProvider];
loader.objectMapping = [mappings recordingObjectMapping];
}];
これは「録音」タイプの新しいエンティティを作成し、POSTリクエストでサーバにエンティティを送信します。成功した場合、これは素晴らしいです。
ただし、サーバーがこれらの作成を合法的に拒否することがあるという問題があります。このような状況で私が見つけたのは、コアデータデータベースにIDの0(IDはサーバーによって設定されたプライマリキー)のエンティティのローカルコピーが既に存在することです。
ローカルエンティティを削除する唯一の方法は、サーバーからローカルデータを強制的に更新することです。
サーバが2xxで応答した場合にのみオブジェクトをローカルに保持する方法はありますか?あるいは、サーバーが2xx以外の何かで応答した場合、変更を元に戻す方法はありますか?
おかげで、残念ながら
FWIW、RestKitドキュメントに規定する 記録*をR = [録画オブジェクト] とエンティティを作成することで、すべての動作を変更しません。 – apurva
RKにサーバレスポンスのコールバックメソッドがありませんか?オブジェクトへの参照を保持し、アップロードが拒否された場合は削除します。 – Mundi
@mundiこれは1つのアプローチであり、より望ましいものでもあります。しかし、サーバがペイロードを受け入れた後でのみ、ローカル状態を維持することが可能かどうか疑問に思っていました。これにより、冗長コードが大幅に少なくなります。 – apurva