1

当从同一个 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
}];
4

0 回答 0