RestKit putObject - 它应该为我处理回到核心数据存储的持久性吗?

RestKit putObject - should it handle persistence back to the Core Data store for me?

我正在使用 RestKit 0.27.0 并成功地设置了我的核心数据堆栈,几乎与 RestKits 中的 TwitterCoreData 示例完全一样 GitHub。

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

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

以addressLine1为例,它被设置为:“4 Some Address”。然后,我将它更新为 NSManagedObject 上的“4 TEST THIS CHANGE”,并将其作为 PUT 上的对象传递。

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

2017-03-02 15:05:18.006 Albert[41779:1232025] T restkit.object_mapping:RKMappingOperation.m:748 Skipped mapping of attribute value from keyPath 'addressLine1 to keyPath 'addressLine1' -- value is unchanged (4 TEST THIS CHANGE)

就好像因为我已经更新了 NSManagedObject 上的 addressLine1 值,所以 RestKit 没有将其视为更改?

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

我找不到任何可以帮助我理解哪里出了问题的 putObject: 文档,因此基于最新版本的 RestKit(截至撰写本文时为 0.27.0)-最好提供或指向一个示例,从引用现有的 NSManagedObject 开始,更新其上的 属性(属性),然后将其作为参数发送到 PUT 请求中。我想象 RestKit "should" 正在为我处理核心数据的持久性,就像它在 GET 和 POST 请求上所做的那样。

看来我误解了 RestKit 如何与 CoreData 一起工作。

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

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

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

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

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: 中的 "Object" 只是告诉 RestKit 它是哪个对象,以便 RestKit 可以选择合适的请求/响应描述符进行路由。 parameters: 参数必须对所述对象进行任何更改。

注意: 也可以像这样将对象放入调用中:

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

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

看来 RestKit 会将参数的更改与对象合并并重建请求。