RestKit-fetchFromDataStore(缓存)问题 [英] RestKit - fetchFromDataStore (cache) issue

查看:65
本文介绍了RestKit-fetchFromDataStore(缓存)问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究RestKit框架及其工作方式。
然后我创建一个简单的项目,该项目将调用Github api并将数据加载到表格视图中(在我阅读了一些教程之后),关于从远程加载和映射它可以正常工作并加载到表格视图中,但是当我尝试从数据存储区-离线模式获取-应用程序将崩溃,这是日志:

I were looking at RestKit framework and how it works. Then I create simple project that will call Github api and load the data into a tableview - after some tutorials I have read -, regarding loading and mapping from remote it works fine and loaded to the tableview but when when I'm trying to fetch from datastore -offline mode- the app will crash and this is the log:

2012-07-29 16:21:41.611 RKGithubClient_FromZtoH[29181:c07] I restkit:RKLog.m:33 RestKit initialized...
2012-07-29 16:21:53.161 RKGithubClient_FromZtoH[29181:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'executeFetchRequest:error: A fetch request must have an entity.'
*** First throw call stack:
(0x20b9022 0x197acd6 0xf15871 0x643c 0x42e5 0x3e14 0x4697 0x53838f 0x5385eb 0x5394ed 0x4a6a0c 0x4abf92 0x4a614b 0x495550 0x495670 0x495836 0x49c72a 0x2a6a 0x46d386 0x46e274 0x47d183 0x47dc38 0x471634 0x25e1ef5 0x208d195 0x1ff1ff2 0x1ff08da 0x1fefd84 0x1fefc9b 0x46dc65 0x46f626 0x259d 0x2505)
terminate called throwing an exception

这是fetchFromDataStore方法:

This is fetchFromDataStore method:

- (void)fetchFromDataStore
{
    NSFetchRequest *request = [[[RKObjectManager sharedManager] mappingProvider] fetchRequestForResourcePath:self.resourcePath]; //self resourcePath]];
    self.repos = [GithubRepo objectsWithFetchRequest:request];
    [self.tableView reloadData];
}

由于我已经为它们创建了实体,所以知道为什么会发生这种情况此链接的源代码:

Any idea why that's happening since I have created entities for them, you can check the source code from this link:

源代码

还有,RestKit缓存是否有有用的示例或教程?

Also, is there any useful examples or tutorials for RestKit caching?

谢谢,

推荐答案

最后,我得到了答案。

问题与以下事实有关:当我请求:
NSFetchRequest * request = [[[RKObjectManager sharedManager] mappingProvider] fetchRequestForResourcePath:self.resourcePath];
在myViewController.m上,返回为空。
发生原因是因为未将对象映射器配置为正确处理核心数据缓存。
我正在使用:

The problem is connected to the fact that, when I ask for: NSFetchRequest *request = [[[RKObjectManager sharedManager] mappingProvider] fetchRequestForResourcePath:self.resourcePath]; on myViewController.m, that comes back empty. The reason that happens is because the object mapper has not been configured to correctly handle the core data cache. I'm using:

- (void)setObjectMapping:(RKObjectMappingDefinition *)objectMapping forResourcePathPattern:(NSString *)resourcePathPattern;

而我应该使用:

- (void)setObjectMapping:(RKObjectMappingDefinition *)objectMapping forResourcePathPattern:(NSString *)resourcePathPattern withFetchRequestBlock:(RKObjectMappingProviderFetchRequestBlock)fetchRequestBlock;

位于对象映射的Core数据扩展中。您提供的额外块用于确定需要哪个提取请求,具体取决于在resourcePath中传递的参数(在本例中为用户RestKit)。在特定情况下,我想返回一个回购请求,当回购者的用户== RestKit时,该回购请求会寻找回购。

which lives in the Core data extension of the object mapping. The extra block you provide serves the purpose of deciding which fetch request is required, depending on the parameters passed in the resourcePath (in this case, the user RestKit). In the specific case, I'd want to return a fetch request that looks for repos when the repo's user == "RestKit".

虽然很难找到文档这种方法非常有用:

The documentation, although hard to find for this method, is pretty helpful:

/**
 Configures an object mapping to be used when during a load event where the resourcePath of
 the RKObjectLoader instance matches resourcePathPattern.

 The resourcePathPattern is a SOCKit pattern matching property names preceded by colons within
 a path. For example, if a collection of reviews for a product were loaded from a remote system
 at the resourcePath @"/products/1234/reviews", object mapping could be configured to handle
 this request with a resourcePathPattern of @"/products/:productID/reviews".

 **NOTE** that care must be taken when configuring patterns within the provider. The patterns
 will be evaluated in the order they are added to the provider, so more specific patterns must
 precede more general patterns where either would generate a match.

 @param objectMapping The object mapping to use when the resourcePath matches the specified
 resourcePathPattern.
 @param resourcePathPattern A pattern to be evaluated using an RKPathMatcher against a resourcePath
 to determine if objectMapping is the appropriate mapping.
 @param fetchRequestBlock A block that accepts an individual resourcePath and returns an NSFetchRequest
 that should be used to fetch the local objects associated with resourcePath from CoreData, for use in
 properly processing local deletes
 @see RKPathMatcher
 @see RKURL
 @see RKObjectLoader
 */
- (void)setObjectMapping:(RKObjectMappingDefinition *)objectMapping forResourcePathPattern:(NSString *)resourcePathPattern withFetchRequestBlock:(RKObjectMappingProviderFetchRequestBlock)fetchRequestBlock;

这篇关于RestKit-fetchFromDataStore(缓存)问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆