IT门户网,专注电脑知识与技术及手机硬件信息服务网站!

当前位置:IT门户网 > 系统教程 >

iOS开拓-去model化开拓

时间:2021-09-14    来源:IT门户网    人气:

文章转载自: Sindri的小巢 原文链接:

媒介

去model化是一种框架设计上的做法,个中的model并不是指架构中的model层,套用Casa大神博客中的原文就是:

model化就是利用数据工具,去model化就是不利用数据工具。

常见的去model化做法是利用字典生存数据信息,然后提供一个reformer认真将这些字典数据转换成View层可展示的信息,其流程图如下:

iOS开辟-去model化开辟

更具体的理论常识可以看Casa大神的去model化和数据工具。本文基于Casa大神的实践基本利用别的一种去model化的实现方法。

利用配景

在很早之前就看过大神的文章,不外一直没有去实验这种做法。在笔者最近跳入新坑之后,总算是有了这么一次时机。需求是存在着三个很是相似的cell,但别离对应着差异的数据model:

iOS开辟-去model化开辟

总结三个cell都需要的展示数据包罗: * 产物名称 * 利用条件 * 截至日期 * 配景图片*

另外,优惠信息属于第一个和第二个独占的。此刻这一需求存在的问题主要有这么三点:

三种数据工具在处事器返回的属性字段中定名不同大

这是大部门的应用都存在的一个问题,可是本文中的数据工具有一个显著的特点是它们对应显示的cell存在很大的相似度,可以被转换成相似的展示数据

三种cell可以封装成一种,却别离对应着差异的数据工具

这里涉及cell和数据工具的对接问题,假如cell在今后产生改变了,那么原有的数据工具是否还能合用

节制器需要在数据源要领中调配差异的cell和model,耦合过大

这个也是常见的问题之一,凡是可以思量合用工场模式将调配的业务疏散出去,但在本文中回收去model的方法实现

这些问题都有大概导致项目后期维护的进程中变得难以修改,小小的需求窜改城市导致代码的大改。笔者的办理方法是拟定cell和model之间对应的两个协议,从而节制器无需剖析两者的详细范例。

实现

我在上一篇文章MVC架构杂谈中提到过M层的业务逻辑放在model中,固然本文要去model化,但只是去除属性工具,自身的逻辑处理惩罚还保存着。下面是笔者去model化的协议图以及协议声明属性:

iOS开辟-去model化开辟

@PRotocol LXDTicketModelProtocol <NSObject>@optional@property (nonatomic, readonly) NSAttributedString * perferential;@required@property (nonatomic, readonly) NSString *backgroundImageName;@property (nonatomic, readonly) NSString * goodName;@property (nonatomic, readonly) NSString * effectCondition;@property (nonatomic, readonly) NSString * deadline;@property (nonatomic, readonly) LXDCellType type;- (instancetype)initWithDict: (NSDictionary *)dict;@end@protocol KMCTicketCellProtocol<NSObject>- (void)configurateCellWithModel: (id<LXDTicketModelProtocol>)model;@end

对付本文之中这种存在配合显示结果的model,可以声明一个包括多个readonly属性的协议,让这些模子工具在协议的getter要领中执行数据->展示这一进程的业务逻辑,而model自身只需简朴的持有字典数据即可:

字典数据 --/p展示数据

以LXDCouponTicketModel为例,协议的实现代码如下:

// h文件@interface LXDCouponTicketModel: NSObject<LXDTicketModelProtocol>@end// m实现@implementation LXDCouponTicketModel{ NSDictionary * _dict;}- (NSString *)backgroundImageName{ return ([_dict[@"overdue"] boolValue] ? @"coupon_overdue" : @"coupon_common");}- (NSAttributedString *)perferential{ NSAttributedString * result = objc_getAssociatedObject(self, KMCPerferentialKey); if (result) { return result; } NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc] initWithString: @"¥" attributes: @{ NSFontAttributeName: [UIFont systemFontOfSize: 16] }]; [attributedString appendAttributedString: [[NSAttributedString alloc] initWithString: [NSString stringWithFormat: @"%g", [_dict[@"ticketMoney"] doubleValue]] attributes: @{ NSFontAttributeName: [UIFont boldSystemFontOfSize: 32] }]]; [attributedString addAttributes: @{ NSForegroundColorAttributeName: KMCCommonColor } range: NSMakeRange(0, attributedString.length)]; result = attributedString.copy; objc_setAssociatedObject(self, KMCPerferentialKey, result, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return result;}- (NSString *)goodName{ return [_dict[@"goodName"] stringValue];}- (NSString *)effectCondition{ return [NSString stringWithFormat: @"· 满%lu元可用", [_dict[@"minLimitMoney"] unsignedIntegerValue]];;}- (NSString *)deadline{ return [NSString stringWithFormat: @"· 兑换截至日期:%@", _dict[@"deadline"]];}- (LXDCellType)type{ return LXDCellTypeCoupon;}- (instancetype)initWithDict: (NSDictionary *)dict{ if (self = [super init]) { _dict = dict; } return self;}

上一篇:iOS真机调试 下一篇:在IOS中利用多线程

相关文章

系统教程排行榜

更多>>

网络知识排行榜

更多>>

系统教程排行榜

更多>>

服务号