当从同一个 webService 收到的 JSON 必须映射到多个实体时,我在使用 ResKit 管理孤立对象时遇到问题。
我已经按照这里的示例http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html(在“删除孤立对象”部分下),我可以删除孤立对象,但仅限于单个实体。
让我们看一些代码...
接下来是我从 webService 收到的(一小部分)JSON。
{
"families": [
{
"id": "000",
"desc": "desc_1"
},
{
"id": "001",
"desc": "desc_2"
}
],
"categories": [
{
"id": "00000000",
"desc": "test"
....//others attributes
},
{
"id": "00000001",
"desc": "test"
....//others attributes
}
]
}
我将此 JSON 正确映射到 2 个不同的实体:类别和家庭。
现在,据我所知,我可以通过将 FetchRequestBlock 添加到我的 RKObjectManager 来删除孤立对象(不再从服务器接收到的对象)。
这是我的定义:
[objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {
RKPathMatcher* pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"getData.asp"];
NSDictionary *dic = nil;
if ([pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:YES parsedArguments:&dic]) {
NSFetchRequest *fetchRequest = [NSFetchRequest new];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Family" inManagedObjectContext: managedObjectStore.mainQueueManagedObjectContext];
fetchRequest.entity = entity;
return fetchRequest;
} else
return nil;
}];
我的问题:如您所见,在 FetchRequestBlock 中,我只定义实体“Family”,但我想删除同一块内的“Category”实体的孤立对象......这可能吗?或者我必须创建另一个仅与实体名称不同的类似块?
是否有一种方法可以将“keyPath”(如本例中的“类别”或“家庭”)添加到 FetchRequestBlock,以便我可以确保删除正确的 NSManagedObject?或者这是不必要的?
编辑:
为了完成,我添加了更多代码,所以我认为你可以更好地理解我在做什么(并且,如果我做错了什么,请纠正我......)
这是我定义 RKResponseDescriptor 的方式,我可以在其中正确地将它与“KeyPath”相关联:
//Categories
RKResponseDescriptor *categoriesDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:categoriesMapping
method:RKRequestMethodGET
pathPattern:@"getData.asp" keyPath:@"categories"
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
//Families
RKResponseDescriptor *familiesDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:familiesMapping
method:RKRequestMethodGET
pathPattern:@"getData.asp" keyPath:@"families"
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
我使用以下代码从 webService 检索数据:
[[RKObjectManager sharedManager] getObjectsAtPath:@"getData.asp" parameters:@{kAuthKeyName : kAuthKeyValue} success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
//Success block
//Before entering in this block, I can see with debug that ResKit try to
//automatically delete objects that return from the "FetchRequestBlock" defined in above code...
}failure:^(RKObjectRequestOperation *operation, NSError *error) {
//Failure Block
}];