首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RESTKit在响应为空时删除对象

RESTKit在响应为空时删除对象
EN

Stack Overflow用户
提问于 2012-07-17 20:42:21
回答 4查看 2.9K关注 0票数 4

我使用RESTKit已经有一段时间了,在数据库中加载json比较容易。但是,有时我一直在谷歌上搜索,却找不到解决这个问题的方法。

我建立了一个托管对象模型,使得三个不同的实体之间有一个直接的一对一的关系。我的模型的布局如下;

如果我在朋友类上加载对象,它也会根据朋友模型中的映射关系映射到其余两个模型。

如果用户连接他的facebook账户并在账户中链接,那么很明显,json的响应将包含linkedin和好友模型的映射。在这种情况下,联合申诉委员会的答复是;

代码语言:javascript
复制
[
   {
      "name":"foo bar",
      "id":307,
      "facebook":{
         "name":"foo bar",
         "username":"foo.bar.5074",
         "id":"1000013421379389",
         "picture":"https://fbcdn-profile-a.akamaihd.net/foo-bar.jpg"
      },
     "linkedin":{
         "name":"foo bar",
         "headline":"some headline",
         "id":"1000013",
         "link":"http://www.linkedin.com/foo.bar",
         "image":"https://linkedin.com/foo-bar.jpg"
      },
      "picture":"https://fbcdn-profile-a.akamaihd.net/foo-bar.jpg"
   },
   {
     ... 
    }
  ]

但是,一旦用户连接了Facebook和Linkedin,他也可以通过网站解除链接。因此,如果用户解除链接,json响应将不具有与一般情况相同的映射,并且可能不包含json响应中的facebook对象或linkedin对象,因此响应看起来类似于,

代码语言:javascript
复制
[
       {
          "name":"foo bar",
          "id":307,
          "facebook":{
             "name":"foo bar",
             "username":"foo.bar.5074",
             "id":"1000013421379389",
             "picture":"https://fbcdn-profile-a.akamaihd.net/foo-bar.jpg"
          },
          "picture":"https://fbcdn-profile-a.akamaihd.net/foo-bar.jpg"
       },
       {
         ... 
        }
      ]

如果出现这样的响应,我想删除现有的链接为用户记录。或者,如果响应没有facebook,或者两者都有,我想删除本地记录和模型的关联,以响应中的空值为准。

我希望RESTKit自动删除相关的对象。我认为可以通过Restkit在对象加载器中指定fetch请求,但我对此不太确定。我使用加载器模式来加载对象,所以我将在哪里指定获取请求,

编辑的

代码语言:javascript
复制
RKObjectMappingProvider *provider = [RKObjectMappingProvider mappingProvider];
[provider setObjectMapping:[self objectMappingForFriend] forKeyPath:@""];

[provider setObjectMapping:[self objectMappingForFriend] forResourcePathPattern:resourcePath withFetchRequestBlock:^NSFetchRequest *(NSString *resourcePath) {

    return [Friend fetchRequest];

}];

    [[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader){
        loader.mappingProvider = provider;
        loader.delegate = self;
        loader.method = RKRequestMethodGET;
    }];

_I认为我这里有多余的代码。_

这样,当响应为空时,我希望删除本地存储中的所有对象。但是,这对我不管用。我不知道该如何处理这个问题。

更新:当地时间2012年7月8日下午2:23

代码语言:javascript
复制
self.objectManager = [RKObjectManager objectManagerWithBaseURL:[NSURL URLWithString: @"https://mywebsite"]];
        self.objectManager.client.disableCertificateValidation = YES;
        self.objectManager.client.cachePolicy = RKRequestCachePolicyLoadIfOffline | RKRequestCachePolicyLoadOnError | RKRequestCachePolicyTimeout | RKRequestCachePolicyEtag;
        self.objectManager.requestCache.storagePolicy = RKRequestCacheStoragePolicyPermanently;
        self.objectManager.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES;
        self.objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"test.sqlite" ];
        self.objectManager.objectStore.cacheStrategy = [RKInMemoryManagedObjectCache new];

现在,设置映射和加载数据,

代码语言:javascript
复制
RKObjectMappingProvider *provider = [RKObjectMappingProvider mappingProvider];
[provider setObjectMapping:[self objectMappingForFriend] forKeyPath:@""];

[provider setObjectMapping:[self objectMappingForFriend] forResourcePathPattern:resourcePath withFetchRequestBlock:^NSFetchRequest *(NSString *resourcePath) {

    return [Friend fetchRequest];

}];

    [[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader){
        loader.mappingProvider = provider;
        loader.delegate = self;
        loader.method = RKRequestMethodGET;
    }];

更新:当地时间2012年7月8日下午4:11

似乎它正在删除一些空的本地对象,但是只有一些对象有引用,即使有空的json响应,主要的模型朋友仍然存在。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-18 06:42:02

这里有两个设置要配置。首先,在您的RKObjectMapping中,您将setNilForMissingRelationships设置为YES。然后,还需要确保Core数据关系具有正确的Delete规则(编辑关系时在实用程序面板中)。有关每个删除规则所做的描述,请参见

票数 4
EN

Stack Overflow用户

发布于 2012-07-18 09:45:04

我必须假设您使用的是最新版本的RestKit。所以,试试这句话:

代码语言:javascript
复制
[RKObjectManager sharedManager].objectStore.managedObjectCache = [RKFetchRequestManagedObjectCache new];

对于一个成功的GET请求,它最终将调用RKManagedObjectLoader deleteCachedObjectsMissingFromResult:它将不缓存您的本地数据。这一原则在我以前回答你之前问题的文章中得到了更好的解释。

票数 2
EN

Stack Overflow用户

发布于 2012-11-08 22:13:09

下面是如何设置缓存策略

代码语言:javascript
复制
[RKObjectManager sharedManager].objectStore.cacheStrategy = [RKFetchRequestManagedObjectCache new];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11530570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档