RestKit putObject - 它应该为我处理持久性回到Core Data存储吗?

时间:2017-03-02 15:47:29

标签: ios core-data restkit

我正在使用RestKit 0.27.0并设法设置我的Core Data堆栈,几乎与RestKits GitHub中的TwitterCoreData示例一样。

我还映射了正确保存核心数据中的对象的GET / POST请求,虽然我的PUT请求有问题。

看来我的PUT请求正在更新服务器上的对象,我可以看到它在响应上更新了。然后我去刷新SQLite数据库查看器,期望实体已经更新,但它还没有。

以addressLine1为例,它设置为:" 4 Some Address"。然后我将其更新为" 4 TEST THIS CHANGE"在NSManagedObject上并将其作为PUT上的Object传递。

我可以在日志中看到以下内容:

  

2017-03-02 15:05:18.006 Albert [41779:1232025] T   restkit.object_mapping:RKMappingOperation.m:748跳过的映射   keyPath' addressLine1到keyPath' addressLine1'的属性值    - 值不变(4 TEST THIS CHANGE)

这几乎就好像因为我已经更新了NSManagedObject上的addressLine1值,RestKit并没有把它作为一个变化来捡起来?

当我重新登录我的应用程序时,它会执行GET请求,当它获取对象时,它会意识到临时对象与存储在CoreData中的实体之间存在差异,因此会成功更新。

我找不到任何putObject:文档可以帮助我理解我哪里出错了,所以基于RestKit的最新版本(截至撰写本文时为0.27.0) - 这将是一件好事。提供或指向从引用现有NSManagedObject开始的示例,更新其上的属性(属性),然后将其作为参数发送到PUT请求中。我想,RestKit"应该"像对待GET和POST请求一样,为我处理Core Data的持久性。

1 个答案:

答案 0 :(得分:0)

看起来我误解了RestKit如何与CoreData一起使用。

最初我首先对Object进行了必要的更新,然后像这样执行PUT请求:

[[RKObjectManager sharedManager] putObject:myObjectWithChanges 
                                 path:path 
                                 parameters:nil 
    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)

我假设通过向NSManagedObject传递更改,它将正常工作。它确实更新了服务器,但是当更新CoreData中的实体时会搞砸 - 似乎RestKit认为它已经是最新的,因为我更新了本地的NSManagedObject。

所以我决定尝试使用nil作为对象,并将更改作为参数中的字典传递(如果要提供路径,则不需要在RestKit中提供Object):

NSDictionary *dict = @{ 
                        @"addressLine1":@"4 TEST THIS CHANGE 11",
                        @"addressLine2":@"Address line 2",
                        @"postCode":@"WN7 5GB"
                      };

[[RKObjectManager sharedManager] putObject:nil           
                                 path:path 
                                 parameters:dict
    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)

将此用于PUT允许我更新服务器上的对象和核心数据中的本地实体。

我只能假设putObject:中的“对象”只是告诉RestKit它是哪个对象,因此RestKit可以选择适当的请求/响应描述符进行路由。 parameters:参数必须对所述对象进行任何更改。

注意:将对象置于通话中也可以这样:

    NSDictionary *dictWithChanges = @{ 
                                        @"addressLine1":@"Change here"
                                     };

    [[RKObjectManager sharedManager] putObject:myObjectWithoutChanges           
                                     path:path 
                                     parameters:dictWithChanges
        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)

似乎RestKit会将参数的更改与Object合并,并重新构建请求。