我正在使用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的持久性。
答案 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合并,并重新构建请求。