背景
资讯在阅读时需要阅读置灰,这个逻辑如果在每一个页面添加的话就需要添加如下几个逻辑
-
模型解析时,通过磁盘数据取得资讯id是否已存储,进而判断是否阅读.
model.read = [[NewsCacheTool shareInstance] isContainNewsIdWithKey:NewsCache_News newsId:getSafeString(dict[@"ID"])]; -
cell刷新时
if (model.read) { self.titleLabel.textColor = kReadColor; } else { self.titleLabel.textColor = UIColorFromRGB(0x222222); } -
didSelect时
model.read = YES;// reloadData NSURL *routeURL = [NSURL URLWithString:@"gtjayyz://moduleNews?method=saveNewsId"]; NSDictionary *routeParam = @{@"newsId" : getSafeString(model.modelId)}; [AppModuleMeditor routeURL:routeURL withParameters:routeParam];
通过上述方案我们会发现,非常难以做到通用,我们即需要在原有的类修改model属性,并且现在项目还需要适配多主题方按,导致代码难以维护.
方案(命令模式)
用行为参数化的方式,封装起来,当用户点击的时候,再触发这个命令的执行.那么就可以达到非常好的效果就是降低代码重合度.
- cell刷新时
ReadColorCommand *cmd = [[ReadColorCommand alloc] init];
[cmd saveNewsId:newsId finish:^(UIColor * _Nonnull color) {
cell.textLabel.textColor = color;
}];
- didSelect时
ReadColorCommand *cmd = [[ReadColorCommand alloc] init];
[cmd colorWithNewsId:newsId finish:^(UIColor * _Nonnull color) {
cell.textLabel.textColor = color;
}];
- 多主题适配,也可以很方便的做到
/// 自定义普通颜色&已读颜色
- (void)customNormalColor:(UIColor *)normalColor readColor:(UIColor *)readColor;
效果
降低代码重合度,方便调用,易以扩展.