使用新的核心数据初始化RestKit的RKPaginator

时间:2013-12-20 12:21:30

标签: ios core-data restkit restkit-0.20

我有一个RKPaginator从服务器加载数据并将其保存到Core Data。这一切都像加载和分页时的魅力。但是,Core Data中的项目是持久的,因此每当我重新进入viewcontroller或重新启动App时,所有以前的分页数据仍然在Core Data中。

当我启动应用程序时,我想从一张干净的表开始。如何告诉Core Data刷新其内容?我尝试了以下代码,但它似乎只是有时工作,并且不规则地,可能是来自传入数据的计时错误。我真的很想在我从Api-Request获得成功回复时才刷新。

NSString *entityDescription = @"Activity";
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:weakSelf.managedObjectContext];
[fetchRequest setEntity:entity];

NSError *error;
NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

for (NSManagedObject *managedObject in items) {
    [self.managedObjectContext deleteObject:managedObject];
}

我将如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

最简单的选择是在应用启动时从磁盘中删除Core Data存储文件并创建一个新文件。这显然不适用于在请求返回良好数据之后保留数据。

为此,您需要能够分辨出旧的和新的。 RestKit可以为你做到这一点,但如果你正在加载分页数据它将无法正常工作(它会删除你获得一个新页面时的页面。)

您可以使用类似于您拥有的代码(应该可以使用的代码),但是在请求的success块中。在success块中,您拥有所有新项目,因此您只需检查它是否是第一个请求(BOOL实例变量),如果是,则删除不在的所有项目mappingResult

答案 1 :(得分:1)

我处于非常类似的情况,使用RestKit和Core Data。远程数据始终是最新的源,因此我希望Core Data“清除”远程数据库中不存在的内容。

我花了一些时间尝试做你想做的事 - 完全清除本地的持久存储 - 我尝试的每一种方式似乎都会引起问题。

RestKit具有内置功能,可以为您更新CoreData,并删除CoreData中不再存在于远程数据源中的那些实体(或者API不再为特定调用返回这些实体)。

它被称为“获取请求块”。

- (void)setupFetchRequestBlocksForObjectManager:(RKObjectManager*)manager
{
    [manager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {
        RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"article"];

        NSDictionary *argsDict = nil;
        BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict];
        if (match) {
            NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Article"];
            fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"articleId" ascending:YES] ];
            return fetchRequest;
        }
        return nil;
    }];
}

在此示例中,我将描述此Fetch Request Block所针对的API调用,然后描述应与其匹配的CoreData请求。

将更改/删除与API调用返回的核心数据对象不同的任何核心数据对象。

此示例适用于非常简单的API调用,但您也可以在匹配器中包含params,以便它只匹配更复杂的请求 - there's a good example of that on the RestKit site.

还有另外一个关于它的问题here.