一、架构背景深度剖析
1.1 问题场景再现
典型痛点表现:
- 编译时间随模块增加呈指数增长(N 模块编译耗时约 [T = k*N^2])
- 多团队协作时出现「修改冲突风暴」
- 基础模块迭代导致全量回归测试
1.2 设计决策矩阵
方案类型 |
编译时耦合 |
运行时开销 |
可维护性 |
学习曲线 |
直接引用 |
高 |
低 |
差 |
低 |
协议抽象 |
中 |
中 |
优 |
高 |
CTMediator |
低 |
中 |
良 |
中 |
URL Router |
低 |
高 |
良 |
低 |
二、技术实现详解
2.1 核心类结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @startuml class CTMediator { - cachedTargets: NSMutableDictionary + sharedInstance(): CTMediator + performTarget(): id + safePerformAction(): id }
class Target_XXX { + Action_YYY(): id }
CTMediator --> Target_XXX : 动态调用 @enduml
|
2.2 完整调用链路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| // 调用端示例(含安全校验) NSDictionary *params = @{ @"pageID": @(1024), @"authToken": @"3a8d7f0e", @"callback": ^(BOOL success) { NSLog(@"操作状态: %@", success ? @"成功" : @"失败"); } };
UIViewController *vc = [[CTMediator sharedInstance] performTarget:@"UserCenter" // 目标模块标识 action:@"ProfilePage" // 功能单元标识 params:[params copy] // 防御性拷贝 shouldCacheTarget:YES]; // 高频访问缓存
// 异常处理流程 if (![vc conformsToProtocol:@protocol(SafeViewProtocol)]) { [self trackException:@{ @"code": @(403), @"reason": @"视图控制器协议不匹配" }]; vc = [FallbackViewController new]; }
|
2.3 性能优化策略
缓存机制实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class CTMediatorCache { private var targetCache = [String: NSObject]() func cache(target: NSObject, forKey key: String) { guard targetCache.count < 20 else { return } targetCache[key] = target } func purgeExpired() { targetCache.keys .filter { lastAccessTime(for: $0) < .now-3600 } .forEach { targetCache.removeValue(forKey: $0) } } }
|
三、架构演进路线
3.1 当前应用场景
1 2 3 4 5 6 7 8 9 10 11 12 13
| graph TD subgraph 基础层 CommonUtils -->|反向调用| CTMediator end subgraph 业务层 FeatureA -->|跨模块调用| CTMediator CTMediator -->|动态路由| I18NModule end subgraph 数据层 Analytics -->|事件上报| CTMediator end
|
3.2 改造路线图
阶段 |
时间范围 |
重点任务 |
关键指标 |
过渡期 |
2025 Q1-Q2 |
建立调用备案制度 |
调用文档覆盖率 ≥90% |
迁移期 |
2025 Q3-Q4 |
核心模块接口改造 |
直接引用占比 ≤30% |
稳定期 |
2026 Q1 |
全量静态校验实施 |
编译时检查覆盖率 100% |
四、最佳实践指南
4.1 安全调用模板
1 2 3 4 5 6 7 8 9 10
| // SafeInvoker.h #define SAFE_CALL(target, action, paramsType) \ __attribute__((overloadable)) \ static inline id safeInvoke(NSString *target, NSString *action, paramsType params) { \ if (![CTMediator validateTarget:target]) { \ [NSException raise:@"非法调用" format:@"未经注册的 Target: %@", target]; \ } \ /* ... 参数校验逻辑 ... */ \ return [[CTMediator sharedInstance] performTarget:target action:action params:params]; \ }
|
4.2 监控指标配置
1 2 3 4 5 6 7 8 9 10 11 12
| { "metrics": { "调用成功率": "98.7%", "平均响应时间": "12ms", "缓存命中率": "82.3%", "异常类型分布": { "TargetNotFound": 45%, "ActionMissing": 30%, "ParamError": 25% } } }
|
五、常见问题诊断
故障现象 |
排查步骤 |
修复方案 |
调用返回 nil |
1. 检查 Target 类前缀<br> 2. 验证 Action 参数类型 |
添加 Class 前缀约定 |
参数传递丢失 |
1. 检查字典 key 大小写<br> 2. 验证 NSJSONSerialization 兼容性 |
使用类型安全的参数包装器 |
内存持续增长 |
1. 检查 Target 缓存策略<br> 2. 分析 ARC 引用关系 |
实现缓存自动回收机制 |
架构师建议:在 Swift 主导的新项目中,建议采用 Protocol-Oriented Dependency Injection
模式逐步替代 CTMediator,同时保留其作为应急通信机制。