ios Mantle - 正确覆盖默认 initWithDictionary

Posted

技术标签:

【中文标题】ios Mantle - 正确覆盖默认 initWithDictionary【英文标题】:ios Mantle - Overriding default initWithDictionary properly 【发布时间】:2014-12-16 10:54:11 【问题描述】:

我面临以下问题..

我有一个类 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 的构造函数返回一个非 NIL 对象。 h 我该怎么做?令我惊讶的是,代码没有到达这个构造函数,因为在形成 Menu.h 时它为空。我也指定了 (NSValueTransformer) 。有任何线索吗?谢谢!

【问题讨论】:

你能添加你用来创建这些对象的代码吗? 嗨@DavidCaunt 感谢您对此进行调查。我调用后端 rest api 来获取一个名为 responseObject 的 JSON 字典。然后我使用 itemList 和此代码的更多链接创建完整菜单。self.menuList = [MTLJSONAdapter modelsOfClass:[Menu class] fromJSONArray:responseObject error:nil]; 这里 menuList 是餐厅菜单项的完整列表(针对此特定应用程序) 实际的json位于这里.. www.grubble.clipr.me/api/v1/restaurant/menu/?restaurant=2 任何一个?我还有很多关于地幔的问题,真的在想我是否应该继续使用它.. 【参考方案1】:

如果 itemList 在 JSON 中是 null,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];

【讨论】:

谢谢大卫,这很有帮助!我还有几个关于 Mantle 的问题,我会自己尝试解决这些问题,否则今晚会再次问他们 :)

以上是关于ios Mantle - 正确覆盖默认 initWithDictionary的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mantle 在 iOS 中解析嵌套的 json

iOS开源库源码解析之Mantle

iOS Mantle Overcoat 实体 ID 映射数组

Mantle 2.0 无法为嵌套数组中的符号解析 JSON

将 Mantle 与核心数据一起使用 - NSSet 和 NSArray

iOS Safari:默认验证气泡消息未正确对齐