提到 SwiftGram,很多人只把它当作另一个 iOS 版 Telegram 客户端,却忽略了它背后那套为移动端量身打造的模块化架构。把源码拆开来看,几乎每一层都用了业界最新的 Swift 语法特性,甚至在 UI 渲染、网络调度和本地持久化之间做了细致的边界划分。
整体架构概览
项目采用“Feature‑Driven Modular”结构,所有功能(聊天、联系人、设置)都被封装成独立的 Swift Package。根目录只保留 App 启动入口和路由层,真正的业务代码全部在子包里,编译时可以按需剔除未使用的模块,减小二进制体积。
UI 层:SwiftUI + Combine
SwiftUI 负责声明式视图,配合 @StateObject、@EnvironmentObject 实现状态共享。所有交互事件统一流向 PassthroughSubject,随后由 Combine 管道转发给对应的 ViewModel。这样既能保持 UI 线程的 60 FPS 渲染,又让业务逻辑脱离视图层。
业务层:MVVM + async/await
每个 Feature 包里都有独立的 ViewModel,遵循 MVVM。网络请求全部改写为 Swift 5.5 原生的 async/await,配合结构化并发的 TaskGroup,一次性并行拉取聊天记录、媒体缩略图和用户信息。官方基准测试显示,启动后 3 秒内完成首次全量同步的时间比传统回调方案缩短约 30%。
数据层:Core Data + SQLite
持久化采用 Core Data 作为对象图层,底层持久化引擎换成了开源的 SQLite‑WAL。为了避免 UI 卡顿,所有写入操作都跑在自定义的 NSPersistentContainer 背景上下文里,并在写完后立即触发 NSFetchedResultsController 的 UI 更新。实测在一千条未读消息的极端场景下,滚动卡顿率低于 0.5%。
模块清单(精选)
- ChatCore:消息模型、加密协议、离线缓存
- AuthKit:手机号验证、OAuth 2.0 流程
- MediaEngine:图片压缩、视频转码、AVFoundation 封装
- WidgetBridge:WidgetKit 与主 App 的状态同步
性能调优案例
一次用户反馈显示,在老旧 iPhone 8 上滚动聊天列表会出现“卡顿”。定位后发现是图片解码在主线程执行。团队把 UIImageDecoder 移入 DispatchQueue.global(qos: .userInitiated),并配合 prefetch 机制提前加载。更新后,同一场景下帧率从 30 FPS 回升到 58 FPS,用户体验立刻得到提升。
