RestKit 将托管对象与非托管对象结合起来

Posted

技术标签:

【中文标题】RestKit 将托管对象与非托管对象结合起来【英文标题】:RestKit Combine Managed Objects with Non-Managed Objects 【发布时间】:2014-04-30 17:03:42 【问题描述】:

我正在尝试在我的请求中使用NSManagedObject 作为响应类,但我也有一些我需要饱和的关系,我不想对其进行管理,因为它们的变化要频繁得多。我尝试使用简单的NSObject 以及与NSManagedObject 的瞬态关系,但任何一种方法都以空关系结束(瞬态或NSObjects 不会饱和)。

这是我想要从请求中饱和并存储在 SQLite 中的对象:

@interface Car : NSManagedObject

@property (nonatomic, retain) NSString *brand
@property (nonatomic, retain) MLocation *location //don't want persisted

@end

这是我希望保留但已饱和的对象:

//I have tried this with NSObject and NSManagedObject
@interface MLocation : NSObject

@property (nonatomic, assign) double latitude;
@property (nonatomic, assign) double longitude;

@end

这是响应描述符:

[manager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:self.buildCarMapping
                                                                            method:RKRequestMethodGET
                                                                       pathPattern:@"/v1/cars/near/:latitude/:longitude"
                                                                           keyPath:nil
                                                                       statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)] ];

这是对象映射:

- (RKObjectMapping *)buildCarMapping 
    RKEntityMapping *carMapping = [RKEntityMapping mappingForEntityForName:@"Car" inManagedObjectStore:self.managedObjectStore];
    [carMapping addAttributeMappingsFromDictionary:@
            @"brand" : @"brand"
    ];

    [carMapping addRelationshipMappingWithSourceKeyPath:@"location" mapping:self.buildLocationMapping];
    return carMapping;


//I have tried this with NSObject and a transient NSManagedObject relationship
- (RKObjectMapping *)buildLocationMapping 
    RKObjectMapping *locationMapping = [RKObjectMapping mappingForClass:[MLocation class]];
    [locationMapping addAttributeMappingsFromDictionary:@
            @"longitude": @"longitude",
            @"latitude": @"latitude"
    ];
    return locationMapping;

这是一个示例响应:


  "brand": "Chevy",
  "location":   //This is ignored by RestKit using my mappings
    "latitude": 42.8,
    "longitude": -98.6
  

【问题讨论】:

【参考方案1】:

我认为没有办法做到这一点,因为托管对象是在后台线程上创建的,而将它们返回给您的唯一方法是销毁这些实例(使用您的临时数据)和从主线程上的持久数据生成相应的实例。

如果您自己在当前线程上创建和执行映射操作,它可能会起作用,但是您需要管理/处理许多其他要求。

我会考虑使用 2 个响应描述符。第一个,像你一样,将核心数据相关内容处理到持久存储中。第二个将用于在适当的实例层次结构中创建普通(临时)对象,其中包含唯一标识符(根据需要),以便您可以在需要时获取关联的托管对象。你不会有直接的关系,但你会得到你需要的所有信息。

【讨论】:

以上是关于RestKit 将托管对象与非托管对象结合起来的主要内容,如果未能解决你的问题,请参考以下文章

Restkit 映射问题 - 将新创建的托管对象发布到服务器

如何在 RestKit 中请求托管对象而不将其写回托管对象上下文?

让 RestKit 离开特定的孤立 CoreData 托管对象

如何从 RestKit 托管对象存储中删除对象

当响应包含在数组中时,RestKit POSTed 托管对象变得重复

单元测试时托管对象上下文为零restkit