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

 

相关文章
|
9月前
|
存储 调度 C++
16 倍性能提升,成本降低 98%! 解读 SLS 向量索引架构升级改造
大规模数据如何进行语义检索? 当前 SLS 已经支持一站式的语义检索功能,能够用于 RAG、Memory、语义聚类、多模态数据等各种场景的应用。本文分享了 SLS 在语义检索功能上,对模型推理和部署、构建流水线等流程的优化,最终带给用户更高性能和更低成本的针对大规模数据的语义索引功能。
672 73
|
消息中间件 大数据 关系型数据库
RocketMQ实战—3.基于RocketMQ升级订单系统架构
本文主要介绍了基于MQ实现订单系统核心流程的异步化改造、基于MQ实现订单系统和第三方系统的解耦、基于MQ实现将订单数据同步给大数据团队、秒杀系统的技术难点以及秒杀商详页的架构设计和基于MQ实现秒杀系统的异步化架构。
939 64
RocketMQ实战—3.基于RocketMQ升级订单系统架构
|
存储 运维 Java
官宣 | Fluss 0.7 发布公告:稳定性与架构升级
Fluss 0.7 版本正式发布!历经 3 个月开发,完成 250+ 次代码提交,聚焦稳定性、架构升级、性能优化与安全性。新增湖流一体弹性无状态服务、流式分区裁剪功能,大幅提升系统可靠性和查询效率。同时推出 Fluss Java Client 和 DataStream Connector,支持企业级安全认证与鉴权机制。未来将在 Apache 孵化器中继续迭代,探索多模态数据场景,欢迎开发者加入共建!
1001 8
官宣 | Fluss 0.7 发布公告:稳定性与架构升级
|
12月前
|
人工智能 安全 Cloud Native
Nacos 3.0 架构升级,AI 时代更安全的 Registry
随着Nacos3.0的发布,定位由“更易于构建云原生应用的动态服务发现、配置管理和服务管理平台”升级至“ 一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台 ”。
|
9月前
|
存储 SQL 消息中间件
从 ClickHouse 到 StarRocks 存算分离: 携程 UBT 架构升级实践
查询性能实现从秒级到毫秒级的跨越式提升
|
资源调度 运维 容灾
中国广电云,全国首个多Region2.0架构升级正式完成并亮相2025CCBN!
2025年4月25日,中国国际广播电视信息网络展览会(CCBN)在北京圆满落幕,在中国广电集团的展台上,阿里云支持建设的“国家文化专网基础设施——中国广电云”接待国家广电总局领导及广电传媒行业专家的参观指导,安全自主、文化特色、全国覆盖、产业智能等中国广电云的鲜明特点给莅临展位的行业同仁留下了深刻的印象。
688 4
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
34_GPT系列:从1到5的架构升级_深度解析
大型语言模型(LLM)的发展历程中,OpenAI的GPT系列无疑扮演着至关重要的角色。自2018年GPT-1问世以来,每一代GPT模型都在架构设计、预训练策略和性能表现上实现了质的飞跃。本专题将深入剖析GPT系列从1.17亿参数到能够处理百万级token上下文的技术演进,特别关注2025年8月8日发布的GPT-5如何引领大模型技术迈向通用人工智能(AGI)的重要一步。
1054 2
|
10月前
|
存储 JSON 数据处理
ClkLog埋点与用户行为分析系统:架构升级与性能全面提升
随着越来越多企业在实际业务中使用 ClkLog,数据规模和分析需求也不断提升,部分用户日活已经超过10万,为了顺应这一趋势,ClkLog 秉持 “开放透明、持续演进”的理念,推出了迄今为止最重要的一次性能优化升级。新版本在大规模数据处理与复杂查询场景中,性能表现实现了跨越式提升。经过多轮研发与严格测试,新版本现已正式上线:在原有付费版 1.0 的基础上架构全面升级,并同步发布全新的 2.0 版本。为用户带来更强的性能与更广的适用场景。
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
1347 69