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的主要内容,如果未能解决你的问题,请参考以下文章
iOS Mantle Overcoat 实体 ID 映射数组