0

私のセットアップ

以下はすべて正常に機能します。

RKManagedObjectMapping* chanMapping = [RKManagedObjectMapping mappingForClass:[Channel class] inManagedObjectStore:objectStore];
chanMapping.primaryKeyAttribute = @"chanId";
[chanMapping mapKeyPathsToAttributes:
 @"id",@"chanId",
 @"name", @"chanName",
 nil]; 

[objectManager.mappingProvider setMapping:chanMapping forKeyPath:@"Channels.channel"];

電話できます

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/channels" delegate:self];

サーバーからチャンネルを取得し、CoreDataによってローカルに保存されます。完全。

問題

ただし、次にGETが実行されたときに、サーバーから削除されたチャネルをRestKitにコアデータストアから自動的に削除させたくありません。これは、以下を追加することでサポートされることを理解しています。

[objectManager.mappingProvider setObjectMapping:chanMapping forResourcePathPattern:@"/channels" withFetchRequestBlock:^ (NSString *resourcePath) { 
        return [Channel fetchRequest];
    }];

ただし、これを使用すると、サーバーに新しいものがあるたびにすべてのチャネルが削除されます。

私が試したこと[更新]

以下の回答の手順を使用してデバッグしました。マッピングが機能していない/見つからないように見えます(つまり、マッピングをリソースパスに適切に関連付けていません)。

配列は見栄えがよくdeleteCachedObjectsMissingFromResultcachedObjects前回から存在するはずのすべてのオブジェクトがありますが、results配列は空であるため、[results containsObject:object]常に存在NOし、すべてのオブジェクトが削除されます。

リソースパスマッピングに関係する何かを変更する必要がありますか?

4

2 に答える 2

2

私はあなたの更新された説明を見ました。これを試してみてください:

  1. に切り替えますsetObjectMapping:forResourcePathPattern:withFetchRequestBlock
  2. rootKeyPathChannels.channelに登録するオブジェクトマッピングにを設定します

次に、もう一度試してください。URLおよびkeyPathベースのマッピング構成を1行で提供するために、進行中のAPI作業がいくつかありますが、まだ開発にマージされていません。

于 2012-05-16T13:22:48.587 に答える
1

説明されている動作が見られる理由を判断するには、次の 2 つの点を確認してください。

  1. RKManagedObjectLoader を開き、 内にブレークポイントを配置しますisResponseMappable。このメソッドは、応答がキャッシュからロードされたかどうかをチェックし、YES が返された場合は、管理対象オブジェクト キャッシュによって返されたオブジェクトを使用してオブジェクトのロードを実行します。これはおそらく、キャッシュされたオブジェクトが返される場所です。
  2. キャッシュされたオブジェクトの削除に関しては、ブレークポイントを中に入れてdeleteCachedObjectsMissingFromResult、そこで何が起こっているかを確認してください (ルーチンに入れている場合でも)。

自動プルーニングを期待するシナリオは次のとおりです。

  1. GET /channels は新しいペイロードで 2xx ステータス コードを返します
  2. RKManagedObjectLoader はプルーニングを実行します
于 2012-05-14T17:11:53.753 に答える