Restkit 对多关系追加到集合而不是设置新集合

Posted

技术标签:

【中文标题】Restkit 对多关系追加到集合而不是设置新集合【英文标题】:Restkit to-many relationship append to set instead of setting a new set 【发布时间】:2012-10-25 03:37:00 【问题描述】:

我有一个与 ios Restkit 相关的问题。我有一个来自远程服务器的父子关系数据,并使用 Restkit 将这些对象映射到 NSManagedObject 对象。我目前遇到的问题是对服务器的每个请求总是消除“子”关系并将其替换为来自服务器的新数据。有没有办法避免这些并附加新的孩子?

例如:我有一个经典的 Category --> Products 关系。

"categories": [
    
        "cat_id": "1",
        "cat_title": "category 1",
        "cat_tag": 1,
        "product": [
            
                "prod_id": "1",
                "prod_name": "product 1",
                "prod_tag": 1
            ,
            
                "prod_id": "2",
                "prod_name": "product 2",
                "prod_tag": 1
            
        ]
    
] 

这一切正常,一切都与 CoreData 上的关系正确保存。但是,如果我向服务器发出另一个请求并得到新的响应:

"categories": [
    
        "cat_id": "1",
        "cat_title": "category 1",
        "cat_tag": 1,
        "product": [
            
                "prod_id": "3",
                "prod_name": "product 3",
                "prod_tag": 1
            ,
            
                "prod_id": "4",
                "prod_name": "product 4",
                "prod_tag": 1
            
        ]
    
] 

我将让产品 3 和产品 4 替换数据库中的产品 1 和产品 2。我确定我正确设置了所有关系和主键。 (cat_idprod_id 都设置为主键)。

通过RestKit的内部框架调查,我注意到RKObjectMappingOperation类中的line 576周围,有

RKLogTrace(@"Mapped NSSet relationship object from keyPath '%@' to
           '%@'. Value: %@", relationshipMapping.sourceKeyPath,
           relationshipMapping.destinationKeyPath, destinationObject);

NSMutableSet *destinationSet = [self.destinationObject
                         mutableSetValueForKey:relationshipMapping.destinationKeyPath];
[destinationSet setSet:destinationObject];

所以我想这很容易改变

[destinationSet setSet:destinationObject];

[destinationSet addObjectsFromArray:[destinationObject allObjects]]

但我想知道是否有更好的方法来做到这一点?

干杯,

【问题讨论】:

【参考方案1】:

感谢Reskit 的支持。现在支持RKRelationshipMapping.(https://github.com/RestKit/RestKit/issues/989)

只需将RKRelationshipMapping 实例的assignmentPolicy 值设置为RKUnionAssignmentPolicy

【讨论】:

以上是关于Restkit 对多关系追加到集合而不是设置新集合的主要内容,如果未能解决你的问题,请参考以下文章

将老集合中重复的元素删除并添加到新集合中

使用 javascript 将 2 个连接的集合插入到新集合 MongoDB

[Google Guava] 2.2-新集合类型

对集合元素进行处理:传统方式和Stream方式的对比

Java新集合

Groovy集合遍历 ( 使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 | 代码示例 )