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 获取本地数据

从 Restkit 获取错误描述

Restkit 从 NSNumber 序列化布尔值

RestKit/RKObjectMapping:从服务器加载数据后如何添加其他属性?

如何从 Restkit + iOS 发布到 Rails