RestKit — исключить сопоставление атрибутов с нулевым значением из RKRequestDescriptor

#ios #objective-c #core-data #restkit #restkit-0.20

#iOS #objective-c #core-данные #restkit #restkit-0.20

Вопрос:

Проблема в том, что мне нужно полностью удалить атрибут @»unitprice» из полезной нагрузки, когда значение равно нулю, но сохранить его там, если оно имеет значение в запросе. Таким образом, полезная нагрузка для строки заказа будет выглядеть следующим образом соответственно: @{«id»: @»orderlineId», @»unitprice»: @»unitprice»} ИЛИ @{«id»: @»orderlineId»} Обратите внимание, что сопоставление представляет собой отношение «один ко многим». Возможно ли это сделать? Ваша помощь действительно ценится, спасибо! /* requestDescriptor */

  (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;
}
  

введите описание изображения здесь

Комментарии:

1. Вы хотите сказать, что unitprice это отношение 1: много? Показать содержимое OrderLine.h

Ответ №1:

Установите assignsDefaultValueForMissingAttributes значение для NO сопоставления. Вам не нужны 2 разных сопоставления (если вы не хотите включить nil в JSON некоторые атрибуты).

Комментарии:

1. Я обновил свой вопрос, поскольку assignsDefaultValueForMissingAttributes не исключает атрибут ‘unitprice’ из JSON, когда он равен нулю, и включает его, когда он имеет значение. Проблема в нашем API, когда ‘unitprice’ не был изменен, мы должны исключить его из сопоставления JSON, поэтому мы присваиваем nil ‘unitprice’, а затем мы хотим написать некоторую логику для RestKit, чтобы исключить значения nil из сопоставления JSON. Итак, я думаю, что это возможно только при использовании динамического сопоставления, я прав? Спасибо

2. Установка assignsDefaultValueForMissingAttributes значения NO должна исключать nil из отображаемого результата, вы пробовали и видели иначе? Покажите этот тестовый код.

3. Я добавил эти две строки responseMapping.assignsDefaultValueForMissingAttributes = НЕТ; orderLinesMapping.assignsDefaultValueForMissingAttributes = НЕТ; странно, не повезло, он исключает не сопоставленные атрибуты, но поскольку сопоставляется ‘unitprice’, он сохраняет его со значением nil. В любом случае спасибо.

4. Вы делаете запрос, поэтому применяете его к обратному отображению, которое вы принимаете.

5. к сожалению, проблема в том, что мне нужно полностью удалить атрибут из полезной нагрузки, когда значение равно нулю, но сохранить его там, если оно имеет значение в запросе. Таким образом, полезная нагрузка будет выглядеть следующим образом соответственно: @{«id»: @»orderlineId», @»unitprice»: @»unitprice»} ИЛИ @{«id»: @»orderlineId»} Обратите внимание, что сопоставление представляет собой отношение «один ко многим». Возможно ли это сделать? Ваша помощь действительно ценится, спасибо!

Ответ №2:

Кажется невозможным реализовать динамический дескриптор запроса с отношением «1 ко многим». Поэтому мне пришлось вручную создать NSMutableDictionary, проверив значение nil, а затем добавить свойства с его значениями, например, следующим образом

 [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;
}