获取持久存储中的MappingResult firstObject值,以避免“非法尝试建立关系”错误

时间:2013-07-22 14:28:18

标签: objective-c restkit nsmanagedobject nsmanagedobjectcontext restkit-0.20

我从persistentStoreManagedObjectContext获取一个对象,并在UIView中向我的用户显示它的一些值。该对象,我们称之为Book有一个Author关系。每当我要显示那本书时,我会检查是否设置了作者。如果没有设置,我会这样做:

    [[RKObjectManager sharedManager] getObjectsAtPath:[NSString stringWithFormat:@"/api/rest/userprofiles/%@/",_currentBook.authorID] parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {..}

在成功回调中,我想做一个:

 _currentBook.author = mappingResult.firstObject;
 if (![_currentBook.managedObjectContext saveToPersistentStore:&error]) {
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
 }

然而,我无法做_currentBook.author = mappingResult.firstObject;,因为我得到了:

Illegal attempt to establish a relationship between objects in different contexts

但是,我知道这个新获取的Author保存在persistentStoreCoordinator中,因为我配置了我的RestKit这样做(或者它是默认情况下,我不记得了)。所以我不想再创建那个对象,我只想在我的currentContext中得到它的值persistentStoreManagedObjectContext。我是否必须使用NSFetchedResultsController?

修改

我已经在书中连接到作者,通过authorID,我在从服务器获取Book对象的同时发送回来。但是,可能会出现尚未提取作者对象的情况,因此我会保留该ID。

[bookMapping addConnectionForRelationship:@"author" connectedBy:@{ @"authorID": @"identifier" }];

但是,即使提取了该作者,book.author也会设置为null,除非我再次在持久存储中重新安装。

1 个答案:

答案 0 :(得分:0)

您应该让RestKit使用基于作者ID的外键映射来连接关系。这样,所有更新都在同一个上下文中同时进行,并在返回映射结果之前保存。