阅读置灰方案,使用命令模式实现

223 阅读1分钟

背景

资讯在阅读时需要阅读置灰,这个逻辑如果在每一个页面添加的话就需要添加如下几个逻辑

  • 模型解析时,通过磁盘数据取得资讯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;

效果

降低代码重合度,方便调用,易以扩展.

Demo