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 会将参数的更改与对象合并并重建请求。
我正在使用 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 会将参数的更改与对象合并并重建请求。