我遇到了ResKit用于管理孤立对象的问题,当从同一个webService收到的JSON必须映射到多个实体时。
我已按照此处的示例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个不同的实体:Category和Family。
现在,根据我的理解,我可以通过向我的RKObjectManager添加FetchRequestBlock来删除孤立对象(不再从服务器接收的对象)。
以下是我如何定义它:
[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”实体的孤立对象。 ..这可能吗 ?或者我必须创建另一个仅与实体名称不同的类似块?
是否有方法在FetchRequestBlock中添加“keyPath”(如本例中的“categories”或“系列”),以便我可以确保删除正确的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
}];