ios Mantle - 正确覆盖默认的initWithDictionary

时间:2014-12-16 10:54:12

标签: ios github-mantle

我面临以下问题..

我有一个类Menu.h和Item.h.菜单就像餐馆的菜单,有多个类别(如开胃菜,沙拉等),每个菜单都有多个相关项目。所以Menu.h有一个名为itemList的NSArray属性。我正在尝试使用Mantle自动加载这些对象。

Menu.h

@interface Menu : MTLModel <MTLJSONSerializing>
@property (nonatomic) NSArray *itemList;
@end

并且

Menu.m

@implementation Menu
+ (NSDictionary *)JSONKeyPathsByPropertyKey
{
    // model_property_name : json_field_name
    return @{
             };
}

+ (NSValueTransformer *)itemListJSONTransformer {
    return [NSValueTransformer mtl_JSONArrayTransformerWithModelClass: Item.class];
}

- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error {
    self = [super initWithDictionary:dictionaryValue error:error];
    if (self == nil) return nil;
    return self;
}

Item.m

- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error {
    self = [super initWithDictionary:dictionaryValue error:error];
    if (self == nil) {
      //DO SOMETHING WITH SELF AND RETURN A NON NIL OBJECT
      return self;
    } 
    return self;
}

我的问题如下:如果itemList为null,即来自服务器的null响应是针对itemList的,那么我想覆盖默认的initWithDictionary行为,以便从Item的构造函数中进行SOMETHING和RETURN NON NIL OBJECT。我该怎么办?令我惊讶的是,代码没有到达这个构造函数,因为当Menu.h形成时它是null。我确实指定了(NSValueTransformer)..任何线索?谢谢!

1 个答案:

答案 0 :(得分:1)

如果JSON中itemListnull,则Mantle不会调用您的变换器,因此永远不会调用Item的初始值设定项。

您可以通过更改Menu模型来指定默认值:

- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError *__autoreleasing *)error {
    // Create itemListDefault value.  
    NSDictionary *defaults = @{
        @"itemList" : itemListDefault
    };
    dictionaryValue = [defaults mtl_dictionaryByAddingEntriesFromDictionary:dictionaryValue];
    return [super initWithDictionary:dictionaryValue error:error];
}