带你读《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

 

相关文章
|
15天前
|
运维 持续交付 开发工具
深入浅出:GitOps在微服务架构中的应用
【10月更文挑战第26天】本文深入探讨了GitOps在微服务架构中的应用,介绍了其核心理念、自动化部署流程和增强的可观测性。通过实例展示了GitOps如何简化服务部署、配置管理和故障恢复,并推荐了一些实用工具和开发技巧。
|
6天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
6天前
|
网络协议 数据挖掘 5G
适用于金融和交易应用的低延迟网络:技术、架构与应用
适用于金融和交易应用的低延迟网络:技术、架构与应用
31 5
|
7天前
|
Go 数据处理 API
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。
|
5天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
5天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
10天前
|
监控 iOS开发 开发者
iOS性能优化:深入函数调用栈与符号化技术
在iOS开发中,函数调用栈是理解程序执行流程和优化性能的关键。当应用出现性能问题或崩溃时,能够准确地读取和解析调用栈信息对于快速定位问题至关重要。本文将探讨iOS中的函数调用栈,以及如何通过符号化技术进行有效的性能调优。
24 3
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
13天前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
52 1
|
14天前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
38 2