我正在使用RESTKIT 0.27.0,并设法设法设置了我的核心数据堆栈,几乎就像RESTKITS GITHUB中的TwitterCoredata示例一样。
我还映射了正确的核心数据中对象的get/post请求,,尽管我在put请求方面遇到了麻烦。
看来我的PUT请求正在正确更新服务器上的对象,并且我可以看到它在响应中进行了更新。然后,我去刷新SQLite DB查看器,期望该实体已更新,但事实并非如此。
以adverseLline1为例,它设置为:" 4个地址"。然后,我将其更新为" 4测试此更改"上的NSManagedObject,并将其作为put上的对象传递。
我可以在日志中看到以下内容:
2017-03-02 15:05:18.006 Albert [41779:1232025] T RESTKIT.Object_Mapping:rkmappingoperation.m:748跳过映射 属性值从键盘'squildline1到键盘'squildline1' - 值不变(4测试此更改)
几乎是因为我已经更新了nsmanagedObject上的advellyLine1值,而RESTKIT并没有将其作为更改?
当我重新登录我的应用程序时,它执行了一个get请求,并且当它获取对象时,它意识到瞬态对象与存储在核心中的实体之间存在差异,因此成功地更新了。
我找不到任何putobject:可以帮助我了解我出错的文档,因此根据最新版本的Restkit(截至写作时0.27.0)从引用现有的NSManagedObject,更新其上的属性(属性),然后在PUT请求中以参数为参数,从而从引用现有的NSManagedObject,更新属性(属性)。我想RESTKIT"应该"将持久性处理对我的核心数据,就像在get和发布请求上一样。
看来我误解了RESTKIT如何与Coredata一起工作。
最初,我首先对对象进行所需的更新,然后这样做像这样的PUT请求:
[[RKObjectManager sharedManager] putObject:myObjectWithChanges
path:path
parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
我假设通过将其传递给具有更改的NSManageBject,它将正常工作。它确实更新了服务器,但是在更新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:
中的"对象"仅是告诉RESTKIT它是哪个对象,以便RESTKIT可以选择适当的请求/响应描述符进行路由。这是parameters:
参数必须对所述对象进行任何更改。
注意:也可以将您的对象放在呼叫中也可以:
NSDictionary *dictWithChanges = @{
@"addressLine1":@"Change here"
};
[[RKObjectManager sharedManager] putObject:myObjectWithoutChanges
path:path
parameters:dictWithChanges
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
看来RESTKIT会将参数上的更改与对象合并并重建请求。