RESTKit在响应为空时删除对象

时间:2012-07-17 20:42:22

标签: objective-c ios core-data restkit

我一直在使用RESTKit一段时间,并且更容易加载json将它们保存在数据库中。但是,我一直在谷歌搜索,无法找到解决这个问题的方法。

我有一个托管对象模型设置,使得三个不同的实体彼此之间具有直接的一对一关系。我的模型的布局是:

enter image description here

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

假设用户连接他的Facebook帐户并在帐户中链接,那么很明显json响应将包含linkedin和朋友模型的映射。在这种情况下,json响应是;

[
   {
      "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对象,以使响应看起来像,

[
       {
          "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实现,但我并不是特别确定。我正在使用加载器模式来加载对象,以便在哪里指定获取请求,

EDITED

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日下午2:23当地时间

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];

现在,设置地图广告加载数据

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响应,主模型Friend仍然存在。

4 个答案:

答案 0 :(得分:4)

您可以在此处配置两个设置。首先,在RKObjectMapping中将setNilForMissingRelationships设置为YES。然后,您还需要确保核心数据关系具有正确的删除规则(在编辑关系时在“工具”面板中)。有关每个删除规则的用途的说明,请参阅this

答案 1 :(得分:2)

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

[RKObjectManager sharedManager].objectStore.managedObjectCache = [RKFetchRequestManagedObjectCache new];

对于成功的GET请求,它最终将调用[RKManagedObjectLoader deleteCachedObjectsMissingFromResult:],这将解除您的本地数据。在我之前对您上一个问题的回答中所链接的文章中,该原则得到了更好的解释。

答案 2 :(得分:2)

以下是设置缓存策略的方法

[RKObjectManager sharedManager].objectStore.cacheStrategy = [RKFetchRequestManagedObjectCache new];

答案 3 :(得分:1)

使用新的RestKit,可以使用fetchRequest块作为;

来完成
 [[RKObjectManager sharedManager] addFetchRequestBlock:[self fetchRequestBlock]];


-(RKFetchRequestBlock)fetchRequestBlock{
  RKFetchRequestBlock fetchRequestBlock = ^NSFetchRequest*(NSURL *url){
    if( [url.relativePath isEqualToString:@"api/app/v1/network_contacts"] ){
      return [NSFetchRequest fetchRequestWithEntityName:@"Person"] ;
    }
    return nil ;
  };
  return fetchRequestBlock;
}

此方法查询本地数据库并比较远程对象,如果未匹配则从本地存储中删除该对象。