iOS老司机可落地的中大型iOS项目中的设计模式优化Tips
我正在参加「掘金·启航计划」
1. 前言: 设计模式可以在大型项目中有哪些可落地的优化?
- 本人目前负责一个中大型iOS项目,用PPRows跑一下项目根文件,目前代码量约28W。
- 在这样一个大型项目中,我们组用了哪些方法对业务逻辑及代码架构进行解耦呢?
- 在这种代码量级的项目中,有哪些接地气的,可落地的优化经验呢?
- 在此抛砖引玉,欢迎大家一起相互探讨。
2. 落地: 采用责任链模式 应对产品大大提出的业务变更, 对业务代码进行解耦.
2.1 责任链模式导图
2.2 责任链模式解耦, 核心类文件构成
2.3 责任链模式解耦, 核心代码文件讲解
2.3.1 定义一个抽象的基类BusinessObject
- BusinessObject.h文件 ```
import
//NS_ASSUME_NONNULL_BEGIN
@class BusinessObject;
/// 某一业务完成之后, 返回的结果是否有处理掉这个业务 typedef void(^CompletionBlock)(BOOL handled); /// 这个业务对应的处理者, 有没有处理好这个业务 typedef void(^ResultBlock)(BusinessObject *handler, BOOL handled);
@interface BusinessObject : NSObject
/// 下一个响应者(响应链构成的关键) @property (nonatomic, strong) BusinessObject *nextBusiness;
/// 响应者的处理方法 - (void)handle:(ResultBlock)result; /// 各个业务在该方法当中做实际业务处理, 完成之后结果返回给调用方 - (void)handleBusiness:(CompletionBlock)completion;
@end
- BusinessObject.m文件
import "BusinessObject.h"
@implementation BusinessObject
/// 责任链入口方法 -(void)handle:(ResultBlock)result { CompletionBlock completion = ^(BOOL handled){ // 当前业务处理掉了,上抛结果 if (handled) { result(self, handled); } else { // 沿着责任链,指派给下一个业务处理 if (self.nextBusiness) { [self.nextBusiness handle:result]; } else { // 没有业务处理,上抛 result(nil, NO); } } };
// 当前业务进行处理 [self handleBusiness:completion]; }
- (void)handleBusiness:(CompletionBlock)completion {
/* 业务逻辑处理 例如异步网络请求、异步本地照片查询等 交给子类复写 /
}
@end ```
- 例如需要处理网络请求的业务A
BusinessA
- 业务A的
BusinessObject.h
文件 ```
import "BusinessObject.h"
NS_ASSUME_NONNULL_BEGIN
@interface BusinessA : BusinessObject
@end
NS_ASSUME_NONNULL_END ```
- 业务A的
BusinessObject.m
文件 ```
import "BusinessA.h"
@implementation BusinessA
- (void)handleBusiness:(CompletionBlock)completion { NSLog(@"处理业务A");
// 业务顺序: A -> B -> C // completion(NO);
// 业务顺序: C -> B -> A completion(YES); }
@end ```
- 业务B的
BusinessObjectB.h
文件 ```
import "BusinessObject.h"
NS_ASSUME_NONNULL_BEGIN
@interface BusinessB : BusinessObject
@end
NS_ASSUME_NONNULL_END ```
- 业务B的
BusinessObjectB.m
文件 ```
import "BusinessB.h"
@implementation BusinessB
- (void)handleBusiness:(CompletionBlock)completion {
NSLog(@"处理业务B");
// 业务顺序: A -> B -> C // completion(NO);
// 业务顺序: C -> B -> A completion(NO); }
@end ```
- 业务C的
BusinessObjectC.h
文件 ```
import "BusinessObject.h"
NS_ASSUME_NONNULL_BEGIN
@interface BusinessC : BusinessObject
@end
NS_ASSUME_NONNULL_END ```
- 业务C的
BusinessObjectC.m
文件 ```
import "BusinessC.h"
@implementation BusinessC
- (void)handleBusiness:(CompletionBlock)completion {
NSLog(@"处理业务C");
// 业务顺序: A -> B -> C // completion(YES);
// 业务顺序: C -> B -> A completion(NO); }
@end ```
2.3.2 实际业务使用责任链模式方法
``` // // ViewController.m // appDesignPattern // // Created by JackLee on 2022/9/21. //
import "ViewController.h"
import "BusinessA.h"
import "BusinessB.h"
import "BusinessC.h"
import "appDesignPattern-Swift.h"
@interface ViewController ()
@end
@implementation ViewController
-
(void)viewDidLoad { [super viewDidLoad]; }
-
(void)touchesBegan:(NSSet
)touches withEvent:(UIEvent )event { [self testBusiness]; } -
(void)testBusiness {
BusinessA businessObjA = [BusinessA new]; BusinessB businessObjB = [BusinessB new]; BusinessC *businessObjC = [BusinessC new]; // 业务顺序: A -> B -> C // businessObjA.nextBusiness = businessObjB; // businessObjB.nextBusiness = businessObjC;
// 业务顺序: C -> B -> A businessObjC.nextBusiness = businessObjB; businessObjB.nextBusiness = businessObjA;
// 响应者的处理方法, 责任链入口方法 / 1. 当前业务处理掉了, 上抛结果 2. 当前业务没处理掉, 沿着责任链, 指派给下一个业务处理, 如果没有业务处理, 继续上抛 3. 对当前业务进行处理 handler: handled: 业务处理结果 /
// 业务顺序: A -> B -> C // [businessObjA handle:^(BusinessObject *handler, BOOL handled) { // // // }];
// 业务顺序: C -> B -> A
[businessObjC handle:^(BusinessObject *handler, BOOL handled) {
// handler:
} ```
发文不易, 喜欢点赞的人更有好运气👍 :), 定期更新+关注不迷路~
ps:欢迎加入笔者18年建立的研究iOS审核及前沿技术的三千人扣群:662339934,坑位有限,备注“掘金网友”可被群管通过~
- iOS老司机聊聊实际项目开发中的<<人月神话>>
- iOS老司机可落地在中大型iOS项目中的5大接地气设计模式合集
- iOS老司机的跨端跨平台Hybrid开发Tips
- iOS老司机的2022年回顾, 聊聊寒冬下的实用<<谈判力>>
- iOS老司机可落地的中大型iOS项目中的设计模式优化Tips_桥接模式
- iOS老司机的多线程PThread学习分享
- iOS老司机整理, iOSer必会的经典算法_2
- iOS老司机的<<蓝海转型>>读书分享
- iOS老司机的<<程序员的自我修养:链接、装载与库>>读书分享
- iOS老司机的接地气算法Tips
- iOS老司机的RunLoop原理探究及实用Tips
- iOS老司机整理, iOSer必会的经典算法_1
- iOS老司机的App启动优化Tips, 让启动速度提升10%
- iOS老司机的网络相关Tips
- 恋上数据结构与算法
- iOS老司机带你一起把App的崩溃率降到0.1%以下
- 探究Swift的String底层实现
- iOS老司机万字整理, 可能是最全的Swift Tips
- iOS老司机可落地的中大型iOS项目中的设计模式优化Tips
- 聊一聊Swift中的闭包