通过 RestKit 发布 ManagedObject 会导致“无法更新从未插入的对象”

Posted

技术标签:

【中文标题】通过 RestKit 发布 ManagedObject 会导致“无法更新从未插入的对象”【英文标题】:POSTing a ManagedObject via RestKit results in "Cannot update object that was never inserted" 【发布时间】:2012-06-28 19:37:16 【问题描述】:

我创建一个托管对象保存上下文并像这样发布:

 [[RKObjectManager sharedManager] postObject:tag mapResponseWith:tagMappingForPOST delegate:tagLoader];

tagLoader 获取对象但未能保存在 RestKit 的上下文中:

Failed to save managed object context after mapping completed: The operation couldn’t be completed. (Cocoa error 134030.)

NSUnderlyingException=Cannot update object that was never inserted.

我正在使用具有相同类的相同后端服务器 (Parse.com) 做同样的事情,并且工作正常。关于获得“无法更新从未插入的对象”的潜在原因的任何线索。错误?

【问题讨论】:

你是如何创建你的标签对象的?我怀疑它从未插入到您的持久存储中。也许它在不同的线程/托管对象上下文中,也许它是用 init 创建的而不是 insert? 【参考方案1】:

事实证明,RestKit 希望在将postObject:mapResponseWith:delegate 消息发送到RKObjectManager 之前保存上下文。我的问题是我在 postObject:mapResponseWith:delegate 消息之后立即保存了上下文(我认为这还可以,因为这仍然是在加载程序从 web 服务得到响应之前。我正在做这样的事情:

NSManagedObject *myObj = [NSEntityDescription insertNewObjectForEntityForName:@"MyObjects" inManagedObjectContext:context];
[[RKObjectManager sharedManager] postObject:myObj mapResponseWith:objMappingForPOST delegate:myObjLoader];
[context save:&error];

...然后myObjLoader 将收到响应并尝试更新myObj 中的属性(createdAt、parse 的 objectId 等)并抛出一个错误,指出 myObj 不存在。

我真的应该通读 RestKit 代码以确认,但我很确定发生了什么是 RKObjectManagerpostObject:mapResponseWith:delegate 消息的时间点从托管对象存储创建后台线程和上下文被接收并且永远不会更新响应返回之前可能存在的任何潜在合并。老实说,我希望在收到响应后创建上下文。

所以要做的是在发送postObject:mapResponseWith:delegate 消息之前保存上下文,如下所示:

NSManagedObject *myObj = [NSEntityDescription insertNewObjectForEntityForName:@"MyObjects" inManagedObjectContext:context];
[context save:&error];
[[RKObjectManager sharedManager] postObject:myObj mapResponseWith:objMappingForPOST delegate:myObjLoader];

【讨论】:

这也解决了我的问题。我查看了 RestKits 源代码,没有找到任何保存上下文的地方。不过这很有趣,因为在我开始重构代码之前这不是问题。我认为这也可能是时间/同步问题。 谢谢,我在 [context performBlock:] 内使用 save 不需要,因为我已经在上下文块中。我删除了performBlock,它开始工作了。

以上是关于通过 RestKit 发布 ManagedObject 会导致“无法更新从未插入的对象”的主要内容,如果未能解决你的问题,请参考以下文章

通过 RestKit 发布 ManagedObject 会导致“无法更新从未插入的对象”

通过 RestKit 形成多部分请求

通过 RestKit 使用单个字符串元素列表解析 JSON

Restkit 是不是通过 CoreData Sqlite 处理实体唯一性?

通过 CocoaPods 在 github 上使用 Restkit 的一个分支?

通过 ID 数组映射 RestKit 中的关系不起作用