2

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

 [[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)做同样的事情,并且工作正常。关于获得“无法更新从未插入的对象”的潜在原因的任何线索。错误?

4

1 回答 1

3

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

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 代码以确认,但我很确定正在发生的事情是在收到消息RKObjectManager的时间点从托管对象存储创建后台线程和上下文,postObject:mapResponseWith:delegate并且永远不会更新任何潜在的合并在响应返回之前可能存在。老实说,我希望在收到回复后创建上下文。

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

NSManagedObject *myObj = [NSEntityDescription insertNewObjectForEntityForName:@"MyObjects" inManagedObjectContext:context];
[context save:&error];
[[RKObjectManager sharedManager] postObject:myObj mapResponseWith:objMappingForPOST delegate:myObjLoader];
于 2012-06-29T15:58:54.217 回答