RestKit - 从 RKRequestDescriptor 中排除具有 nil 值的属性映射
Posted
技术标签:
【中文标题】RestKit - 从 RKRequestDescriptor 中排除具有 nil 值的属性映射【英文标题】:RestKit - Exclude attribute mapping with nil value from RKRequestDescriptor 【发布时间】:2014-06-27 03:46:46 【问题描述】:问题是当值为 nil 时,我需要从有效负载中完全删除属性 @"unitprice",但如果它在请求中有值,则将其保留在那里。因此,OrderLine 的有效负载应如下所示:@"id":@"orderlineId", @"unitprice":@"unitprice" OR @"id":@"orderlineId" 请注意,映射是一对多的关系。是否有可能做到这一点?非常感谢您的帮助,谢谢! /* 请求描述符 */
+(RKObjectMapping*) getSalesOrderMapping:(RKRequestMethod)method
RKEntityMapping *requestMapping = [RKEntityMapping mappingForEntityForName:@"SalesOrder"
inManagedObjectStore:[RKManagedObjectStore defaultStore]];
RKEntityMapping *orderLinesMapping = [RKEntityMapping mappingForEntityForName:@"OrderLine"
inManagedObjectStore:[RKManagedObjectStore defaultStore]];
requestMapping.identificationAttributes = @[ @"salesOrderId" ];
NSMutableDictionary *attributeMappings = [NSMutableDictionary dictionaryWithDictionary:@
@"id": @"salesOrderId",
];
NSDictionary *orderLineAttributeMappings = @
@"id": @"orderlineId",
@"unitprice": @"unitPrice"
;
[orderLinesMapping addAttributeMappingsFromDictionary:orderLineAttributeMappings];
[requestMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"lines"
toKeyPath:@"salesOrderToOrderLines"
withMapping:orderLinesMapping]];
return requestMapping;
【问题讨论】:
你是说unitprice
是1:many的关系吗?显示 OrderLine.h 内容
【参考方案1】:
在映射上将assignsDefaultValueForMissingAttributes
设置为NO
。您不需要 2 个不同的映射(除非您确实想在 JSON 中包含 nil
以获取某些属性)。
【讨论】:
我已经更新了我的问题,因为 assignsDefaultValueForMissingAttributes 在 JSON 为 nil 时不会从 JSON 中排除 'unitprice' 属性,并在它有值时包含它。问题在于我们的 API,当“单价”没有改变时,我们应该将其从 JSON 映射中排除,因此我们将 nil 分配给“单价”,然后我们想为 RestKit 编写一些逻辑以排除 nil 值从 JSON 映射。所以我认为这只能通过使用动态映射来实现,对吗?谢谢 将assignsDefaultValueForMissingAttributes
设置为 NO
应该从映射结果中省略 nil,您是否尝试过并看到其他结果?显示该测试代码。
我已经添加了这两行 responseMapping.assignsDefaultValueForMissingAttributes = NO; orderLinesMapping.assignsDefaultValueForMissingAttributes = NO;奇怪的是没有运气,它确实排除了未映射的属性,但是因为“unitprice”被映射了,所以它保持它的值为 nil。无论如何,谢谢。
您正在发出请求,因此您将其应用到您采用的逆映射。
不幸的是,当值为 nil 时,我需要从有效负载中完全删除该属性,但如果它在请求中有值,则将其保留在那里。因此有效负载将如下所示:@"id":@"orderlineId", @"unitprice":@"unitprice" OR @"id":@"orderlineId" 请注意,映射是一个多对多关系。是否有可能做到这一点?非常感谢您的帮助,谢谢!【参考方案2】:
似乎不可能实现具有一对多关系的动态请求描述符。因此,我必须通过检查 nil 值来手动构建 NSMutableDictionary,然后添加具有如下值的属性
[objectManager postObject:nil
path:@"/salesorder"
parameters:[self customSalesOrderRequestMapping]
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) ...
- (NSMutableDictionary *) customSalesOrderRequestMapping
customSalesOrderAttributeDictionary = [NSMutableDictionary new];
if (selectedSalesOrder.salesOrderId) [customSalesOrderAttributeDictionary addEntriesFromDictionary:@@"id": selectedSalesOrder.salesOrderId];
if (selectedSalesOrder.salesOrderToOrderLines.count > 0)
NSMutableArray *orderLinesMutableArray = [NSMutableArray new];
for (OrderLine *orderLine in selectedSalesOrder.salesOrderToOrderLines)
NSMutableDictionary *orderLineMutableDictionary = [NSMutableDictionary new];
if (orderLine.orderlineId) [orderLineMutableDictionary addEntriesFromDictionary:@@"id": orderLine.orderlineId];
if (orderLine.unitPrice) [orderLineMutableDictionary addEntriesFromDictionary:@@"unitprice": orderLine.unitPrice];
[orderLinesMutableArray addObject:orderLineMutableDictionary];
[customSalesOrderAttributeDictionary addEntriesFromDictionary:@@"lines": orderLinesMutableArray];
return customSalesOrderAttributeDictionary;
【讨论】:
以上是关于RestKit - 从 RKRequestDescriptor 中排除具有 nil 值的属性映射的主要内容,如果未能解决你的问题,请参考以下文章
Restkit 从 Foursquare API 返回 nil 响应
使用 RestKit 0.2 从 CoreData 获取本地数据