带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)

简介: 带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)

带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)https://developer.aliyun.com/article/1338304?groupCode=taobaotech

实现代码示例如下

 实现代码示例如下

 

  @implementation TBPipelineManager
  - (TBPipelineManager *(^)(id<TBPipelineDataCreatorDelegate> dataCreator))addDataCreator {
  @weakify
  return ^(id<TBPipelineDataCreatorDelegate> dataCreator) {
  @strongify
  if (dataCreator) {
  [self.dataGenArr addObject:dataCreator];
 }
 return self;
 };
 }
- (TBPipelineManager *(^)(id<TBPipelineDelegate> pipeline))addPipeline {
  @weakify
  return ^(id<TBPipelineDelegate> pipeline) {
  @strongify
  if (pipeline) {
  [self.pipelineArr addObject:pipeline]; 20
  //每一次add的同时,我们做链式标记(通过runtime给每个处理加Next)
  if (self.pCurPipeline) {
  NSObject *cur = (NSObject *)self.pCurPipeline;
  cur.tb_nextPipeline = pipeline;
 }
 self.pCurPipeline = pipeline;
 }
 return self;
 };
 }
  - (void)setThrowDataBlock:(void (^)(id _Nonnull))throwDataBlock {
  _throwDataBlock = throwDataBlock; 34
  @weakify
  //Creator的数组,依次对 Block 回调进行赋值,当业务方调用此 Block 时,就是开始处理数据的时候
   [self.dataGenArr enumerateObjectsUsingBlock:^(id<TBPipelineDataCreatorDelegate> _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  obj.generateDataBlock = ^(id<TBPipelineBaseDataProtocol> data, NSInteger dataId) {
  @strongify
data.dataId = dataId;
//开始递归处理数据
[self handleData:data];
   -  (void)handleData:(id)data {
[self recurPipeline:self.pipelineArr.firstObject data:data];
}
- (void)recurPipeline:(id<TBPipelineDelegate>)pipeline data:(id)data { if (!pipeline) {
return;
}
//递归让pipeline处理数据@weakify
[pipeline receiveData:data throwDataBlock:^(id _Nonnull throwData) { @strongify
NSObject *cur = (NSObject *)pipeline; if (cur.tb_nextPipeline) {
[self recurPipeline:cur.tb_nextPipeline data:throwData];
} else {
!self.throwDataBlock?:self.throwDataBlock(throwData);
}
}];
}
@end



 


 

 

image.png处理单元 Pipeline 包含的功能和特点:

1. 因为数据是基于业务的,所以它只被声明为一个 Protocol ,由上层实现。

 

API 代码示例如下

 

1 @protocol TBPipelineDelegate <NSObject>
2 //如果有错误,直接抛出
3 - (void)receiveData:(id)data throwDataBlock:(void(^)(id data))block;
4 @end

 

上层业务代码示例如下

//以A类型码码处理单元为例@implementation TBGen3Pipeline
- (void)receiveData:(id <TBCodeDataDelegate>)data throwDataBlock:(void (^)(id data))block { TBScanResult *result = data.scanResult;
NSString *scanType = result.resultType;
NSString *scanData = result.data;
if ([scanType isEqualToString:TBScanResultTypeA]) {
//跳转逻辑
...
//可以处理,终止递归BlockInPipeline();
} else {
//不满足处理条件,继续递归:由下一个 Pipeline 继续处理PassNextPipeline(data);
}
}
@end

image.png业务层调用

设置标签

有了上述的框架和上层实现,生成一个码处理管理就很容易且能达到解耦的目的,代码示例如下

- (void)setupPipeline {
//创建 manager 和 creator
self.manager = TBPipelineManager.new; self.dataCreator = TBDataCreator.new;
//创建 pipeline
TBCodeTypeAPipelie *codeTypeAPipeline = TBCodeTypeAPipelie.new; TBCodeTypeBPipelie *codeTypeBPipeline = TBCodeTypeBPipelie.new;
//...
TBCodeTypeFPipelie *codeTypeFPipeline = TBCodeTypeFPipelie.new;

 

11

 

12

 

//往 manager 中链式添加 creator 和 pipeline

13

 

@weakify

14

 

self.manager

15

 

.addDataCreator(self.dataCreator)

16

 

.addPipeline(codeTypeAPipeline)

17

 

.addPipeline(codeTypeBPipeline)

18

 

.addPipeline(codeTypeFPipeline)

19

 

.throwDataBlock = ^(id data) {

20

 

@strongify

21

 

if ([self.proxyImpl respondsToSelector:@selector(scanResultDidFailedProcess:)]) {

22

 

[self.proxyImpl scanResultDidFailedProcess:data];

23

 

}

24

 

};

25

}

 

 

 带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(4)https://developer.aliyun.com/article/1338239?groupCode=taobaotech

 

相关文章
|
5天前
|
Kubernetes 开发者 Docker
构建高效微服务架构:Docker与Kubernetes的协同应用
【5月更文挑战第30天】 在当今软件开发领域,微服务架构已成为实现系统模块化、提升可维护性及扩展性的关键策略。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理,共同构建一个既高效又可靠的后端微服务环境。我们将剖析Docker和Kubernetes的核心功能,以及它们如何相辅相成,支撑起现代化的云原生应用程序部署和管理。文章还将提供具体实践案例,帮助开发者理解将理论应用于实际开发过程中的步骤和考虑因素。
|
4天前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
19 2
|
4天前
|
Kubernetes Cloud Native 开发者
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第31天】 在数字化转型和技术迭代的大潮中,企业对于敏捷、可扩展的IT基础设施需求日益增长。云原生技术以其独特的优势成为推动这一进程的关键力量。本文深入探讨了如何通过结合Kubernetes容器编排和微服务架构来构建和维护高效、可靠的云原生应用。我们将剖析这种技术整合的必要性,揭示其背后的原理,并讨论在实际部署过程中可能遇到的挑战及解决方案。通过案例分析和最佳实践的分享,旨在为开发者和架构师提供一套行之有效的云原生应用构建指南。
|
4天前
|
敏捷开发 Kubernetes Cloud Native
构建高效云原生应用:容器化与微服务架构的融合
【5月更文挑战第31天】 随着云计算技术的不断演进,云原生应用已成为企业数字化转型的核心。本文深入探讨了如何通过容器化技术和微服务架构的有效结合,构建高效、弹性和可扩展的云原生应用。我们将分析容器化的基本概念、优势以及它如何促进微服务架构的实施,同时提供策略和最佳实践,帮助企业实现敏捷开发和持续部署,优化资源利用,并提高系统的可靠性。
|
5天前
|
Cloud Native 算法 程序员
代码与禅意:编程中的哲学思考构建未来:云原生架构在现代企业中的应用与挑战
【5月更文挑战第30天】 在数字世界的繁花似锦之下,编程不仅仅是一种技能,更是一场关于逻辑、美学和哲学的深刻对话。本文将探讨编程过程中所体现出的哲学理念,从禅宗的角度出发,揭示代码背后蕴含的深层次意义。我们将一同走进程序员的内心世界,体会在面对复杂问题时,如何通过冥想般的编码实践,达到问题解决的顿悟。
|
5天前
|
设计模式 存储 前端开发
Java的mvc设计模式在web开发中应用
Java的mvc设计模式在web开发中应用
|
5天前
|
机器学习/深度学习 设计模式 计算机视觉
深度学习在图像识别中的应用与挑战构建高效微服务架构:后端开发的新范式
【5月更文挑战第30天】 随着计算机视觉技术的飞速发展,深度学习已成为推动该领域进步的关键力量。本文旨在探讨深度学习在图像识别任务中的核心技术和面临的挑战,通过分析卷积神经网络(CNN)的结构和优化策略,以及新兴的对抗性网络和迁移学习等技术,揭示深度学习如何提高图像识别的准确性和效率。同时,文章还将讨论数据偏差、模型泛化能力和计算资源限制等问题对实际应用的影响。 【5月更文挑战第30天】 在本文中,我们将探讨一种现代软件工程实践——微服务架构。通过分析其核心原则和设计模式,我们旨在为开发者提供一个关于如何构建可扩展、灵活且高效的后端系统的指导。文章将详细讨论微服务的优势,挑战以及如何克服这些
|
6天前
|
敏捷开发 运维 Cloud Native
构建未来:云原生架构在企业数字化转型中的应用
【5月更文挑战第29天】 随着企业加速迈向数字化,云原生架构已成为推动创新和灵活性的关键因素。本文深入探讨了云原生技术如何助力企业实现敏捷开发、自动化运维以及微服务部署,从而提升业务效率和竞争力。通过分析云原生的核心组件和实践案例,揭示了这一技术趋势如何塑造企业的未来。
|
6天前
|
Cloud Native 持续交付 云计算
构建未来:云原生架构在现代业务中的应用与挑战
【5月更文挑战第29天】 随着数字化转型的不断深化,企业对于敏捷性、可扩展性和成本效益的需求日益增长。云原生架构作为一种新兴的技术范式,以其独特的设计理念和运作模式,正成为推动业务创新和实现技术优势的关键力量。本文将深入探讨云原生技术的基本原理,分析其在各行各业中的实际应用案例,并讨论在采纳云原生过程中可能遇到的挑战及解决策略,旨在为读者提供一个全面而深入的视角,以理解和利用云原生架构的潜力。
|
6天前
|
弹性计算 Cloud Native 安全
构建未来:云原生架构在现代企业中的应用与挑战构筑未来:云原生架构在企业数字化转型中的关键作用
【5月更文挑战第29天】 随着数字化转型的浪潮席卷全球,企业对IT基础设施的要求日益提高。云原生技术作为一种新兴的软件部署和运行方式,以其灵活性、可扩展性和资源高效性成为推动企业创新的重要力量。本文将深入探讨云原生架构的核心组件、实施策略以及在实际应用中所面临的挑战,旨在为企业提供构建和维护云原生环境的洞见。