3

我不想以RESTKit默认方式使用,据我所知,这是通过查看唯一 ID 并在找到新 ID 时将对象添加到缓存中或在旧 ID 时从缓存中清除对象来更新缓存对象存在 ID。

相反,我想做的是始终从 URL 端点获取对象,用这些新对象设置缓存,删除所有以前存在的缓存对象。问题是我JSON没有任何唯一的 ID。

是否有可能做到这一点?在调用新对象之前,我尝试删除缓存中的对象未成功。在我尝试太多其他事情之前,我想我先在这里问一下RESTKit.

提前致谢!

4

2 回答 2

3

是的你可以。无论如何,您都不想对所描述的内容使用唯一的 id(尽管如果这样做会起作用,但您可能会在更新的对象中留下一些旧数据)。

无论如何,从您的映射中省略任何唯一的 id 并指定一个获取请求块(部分Fetch Request Blocks and Deleting Orphaned Objects),它只是获取您的实体的所有实例(无谓词)。这将导致 RestKit 在映射期间删除所有旧对象并保存所有新对象。

只要您更新正确的上下文并正确保存,您在发出请求之前删除所有对象的测试就应该有效。

于 2013-11-11T20:37:25.277 回答
2

正如韦恩所说,做到这一点的方法是使用RKFetchRequestBlock. 我不是 100% 确定在获取请求块和删除孤立对象 RKManagedObjectRequestOperation部分中发生了什么,但就我而言,我需要做的就是NSFetchRequest为每个匹配的路径返回一个。由于我的应用程序中有三个端点和三个实体,因此我需要进行三个单独的模式匹配检查并返回 3 个唯一NSFetchRequest的 s。据我了解,如果 aNSFetchRequest返回,管理器将自动查询获取请求块并执行孤立对象清理。

这是我的代码:

RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:baseURL];

    // To perform local orphaned object cleanup
    [objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {

        RKPathMatcher *pathMatcherLeft = [RKPathMatcher pathMatcherWithPattern:@"/api/app/left.json"];
        BOOL matchLeft = [pathMatcherLeft matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:nil];
        RKPathMatcher *pathMatcherRight = [RKPathMatcher pathMatcherWithPattern:@"/api/app/right.json"];
        BOOL matchRight = [pathMatcherRight matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:nil];
        RKPathMatcher *pathMatcherCenter = [RKPathMatcher pathMatcherWithPattern:@"/api/app/center.json"];
        BOOL matchCenter = [pathMatcherCenter matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:nil];
        if (matchLeft) {
            NSLog(@"Pattern matched left.json!");
            NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"LeftViewItem"];
            return fetchRequest;
        }else if (matchRight) {
                NSLog(@"Pattern matched right.json!");
                NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"RightViewItem"];
                return fetchRequest;
        }else if (matchCenter) {
            NSLog(@"Pattern matched center.json!");
            NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"CenterViewItem"];
            return fetchRequest;
        }
        return nil;
    }];
于 2013-12-07T09:39:23.270 回答