English | 简体中文
一个演示如何使用 MonoTask 初始化和缓存应用配置的示例,具有执行合并、重试逻辑和TTL缓存功能。它还展示了消费者如何访问特定的配置值或组合使用字符串,而无需重新获取配置。
- 支持平台:
- iOS 13.0+
- macOS 10.15+
- tvOS 13.0+
- watchOS 6.0+
- Swift: 5.5+
- 依赖项:
- Monstra框架(本地开发版本)
git clone https://github.com/yangchenlarkin/Monstra.git
cd Monstra/Examples/MonoTask/ModuleInitialization# 从ModuleInitialization目录
xed Package.swift或在Xcode中手动操作:
- 打开Xcode
- 选择
File → Open... - 导航到
ModuleInitialization文件夹 - 选择
Package.swift(不是根Monstra项目) - 点击打开
这将示例作为独立的Swift包打开。
最小配置模型(参见 Sources/.../AppConfiguration.swift)。
struct AppConfiguration: Codable, Hashable {
let config1: String
let config2: String
}模拟获取配置,具有小的人工延迟和简单日志记录。
enum AppConfigurationAPI {
static func getAppConfiguration() async throws -> AppConfiguration { /* ... */ }
}包装 MonoTask<AppConfiguration> 以初始化和缓存配置一次(TTL使用 .infinity)。包括固定间隔重试。
- 初始化:
initializeModule(completion:)— 开始获取(forceUpdate=false)。消费者可以在应用启动时调用。
- 访问器(都利用
task.asyncExecute(),因此缓存后不会重新获取):getConfiguration(): 返回完整配置作为Result<AppConfiguration, Error>getConfig1(): 返回config1字符串getConfig2(): 返回config2字符串useConfig1(str:): 返回使用config1的组合字符串useConfig2(str:): 返回使用config2的组合字符串
main.swift 初始化模块,然后演示多个并发消费者读取/使用配置。
let manager = AppConfigurationManager()
print("[ModuleInitialization] start initializeModule()")
manager.initializeModule { result in /* 记录成功/失败 */ }
Task { print(await manager.getConfig1()) }
Task { print(await manager.getConfig2()) }
Task { print(await manager.useConfig1(str: "main.swift")) }
Task { print(await manager.useConfig2(str: "main.swift")) }- 执行合并:未缓存时,并发调用访问器共享一次执行
- 重试逻辑:配置了固定间隔重试(2次尝试)
- 无限TTL:配置缓存应用生命周期(除非您调整策略)
- 单一数据源:访问器函数初始化后不会重复获取
来自此示例的运行示例:
[ModuleInitialization] start initializeModule()
[Mock api] start fetch configuration
[Mock api] did fetch configuration
[ModuleInitialization] initialized: config1=value-1, config2=value-2
success("value-1")
success("main.swift is using value-1")
success("value-2")
success("main.swift is using value-2")
这演示了什么:
- 初始化触发单个配置获取
- 后续访问器调用使用缓存的配置
- 结果值显示原始配置访问和组合使用字符串
- AppConfigurationManager:包装
MonoTask和API的数据/初始化层 - 领域层:如需要DI/测试,定义协议(例如:
AppConfigurationProvider) - 表示层:在启动时调用
initializeModule();在需要时使用访问器
Package.swift— SPM清单(Monstra依赖)Sources/ModuleInitialization/AppConfiguration.swift— 配置模型Sources/ModuleInitialization/AppConfigurationAPI.swift— 模拟数据源Sources/ModuleInitialization/AppConfigurationManager.swift— 包装MonoTask的管理器Sources/ModuleInitialization/main.swift— 初始化与访问器演示
MonoTask<AppConfiguration>使用resultExpireDuration = .infinity(应用生命周期缓存)- 重试:
.count(count: 2, intervalProxy: .fixed(timeInterval: 0.2)) - 访问器通过
asyncExecute()共享相同的缓存结果
