2015-08-27 21 views
0

我正在开发一个事件应用程序,该应用程序使用Restkit将“Events”与JSON API进行同步。映射看起来大致如此。Restkit更新过程中与本地用户对象的持续关系

var eventsMapping = RKEntityMapping(forEntityForName: "Event", inManagedObjectStore: managedObjectStore) 
     eventsMapping.identificationAttributes = ["eventID", "name", "eventDescription"] 
     eventsMapping.addAttributeMappingsFromDictionary([ 
      "id":"eventID", 
      "title":"name", 
      "description":"eventDescription", 
      (more mapping attributes here, etc...) 
      ]) 

使用NSFetchedResultsController显示事件。在本地,有一个'用户'NSManagedObject被创建...但是这个对象只是本地的应用程序,并没有通过Restkit同步到服务器。 “用户”与事件有一对多的关系,用户可以“保存”他们参加的事件。 (注意:现在,核心数据关系删除规则的两端都设置为“无操作”。)保存大致是这样完成的。

var managedObjectContext = RKManagedObjectStore.defaultStore().mainQueueManagedObjectContext 
currentUser.mutableSetValueForKey("events").addObject(event) 
managedObjectContext?.saveToPersistentStore(&error) 

到目前为止,一切都很正常,选择事件存储,并与用户成功地保存并持续通过应用程序将重新启动预期。但是,有一种情况会导致将事件从用户中删除,即在服务器上对该特定事件进行更新时。当Restkit检测到并更新事件时,根据我放置在NSFetchedResultsController didChangeObject中的断点,显然Restkit和/或Core Data实际上正在删除事件,然后将其插回到更新中。这在大多数情况下都是透明的,并且很好,但在这种情况下,我认为最初的删除是从用户中断事件的。

当然,上面的eventsMapping并没有以任何方式引用与用户的任何关系,所以这可能是关系被打破的另一个原因。我一直在阅读关于Restkit关系的更多信息,并且在成功关联对象之前,我已经在Restkit中使用关系/属性映射,但是在这种情况下,这两个对象都存在于API中。在这种情况下,这里的用户根本不是API的一部分,只有本地的解释。那么我还应该使用Restkit关系映射吗?或者,也许我应该试图通过另一种方式完成上述所有内容?

回答

0

我想出了答案,我在上面的代码中做了一个混乱。在映射的标识属性上,我有三个不同的属性,当我只应该使用永远不会改变的主键(eventID)。

eventsMapping.identificationAttributes = ["eventID"] 

什么显然正在发生是因为我指定的标题/名称作为识别属性,每当标题上的服务器Restkit改变将其识别为一个新的/不同的对象,并删除“旧”对象,并插入新的那一个。当我改变它只是为了指定主键时,它会触发更新,而我与用户的关系仍然存在。

对于其他人的另一个注意事项,首先让我想起了一些旧的信息:我遇到过这个问题,帮助我解决了这个问题,即在映射中使用primaryKeyAttribute。这显然是日期信息:改用identificationAttributes。