我不想以RESTKit
默认方式使用,据我所知,这是通过查看唯一 ID 并在找到新 ID 时将对象添加到缓存中或在旧 ID 时从缓存中清除对象来更新缓存对象存在 ID。
相反,我想做的是始终从 URL 端点获取对象,用这些新对象设置缓存,删除所有以前存在的缓存对象。问题是我JSON
没有任何唯一的 ID。
是否有可能做到这一点?在调用新对象之前,我尝试删除缓存中的对象未成功。在我尝试太多其他事情之前,我想我先在这里问一下RESTKit
.
提前致谢!
我不想以RESTKit
默认方式使用,据我所知,这是通过查看唯一 ID 并在找到新 ID 时将对象添加到缓存中或在旧 ID 时从缓存中清除对象来更新缓存对象存在 ID。
相反,我想做的是始终从 URL 端点获取对象,用这些新对象设置缓存,删除所有以前存在的缓存对象。问题是我JSON
没有任何唯一的 ID。
是否有可能做到这一点?在调用新对象之前,我尝试删除缓存中的对象未成功。在我尝试太多其他事情之前,我想我先在这里问一下RESTKit
.
提前致谢!
是的你可以。无论如何,您都不想对所描述的内容使用唯一的 id(尽管如果这样做会起作用,但您可能会在更新的对象中留下一些旧数据)。
无论如何,从您的映射中省略任何唯一的 id 并指定一个获取请求块(部分Fetch Request Blocks and Deleting Orphaned Objects
),它只是获取您的实体的所有实例(无谓词)。这将导致 RestKit 在映射期间删除所有旧对象并保存所有新对象。
只要您更新正确的上下文并正确保存,您在发出请求之前删除所有对象的测试就应该有效。
正如韦恩所说,做到这一点的方法是使用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;
}];