3种内置存储对比详解:Shallows MemoryStorage、DiskStorage 与 NSCacheStorage 实战指南 3种内置存储对比详解Shallows MemoryStorage、DiskStorage 与 NSCacheStorage 实战指南【免费下载链接】Shallows Your lightweight persistence toolbox项目地址: https://gitcode.com/gh_mirrors/sh/ShallowsShallows是一款面向 Swift 开发者的轻量级持久化工具箱lightweight persistence toolbox它通过StorageKey, Value这一统一抽象把内存、磁盘、系统缓存三种存储方式封装成可互相组合的组件。本文带你一次看懂它内置的三种存储MemoryStorage、DiskStorage与NSCacheStorage的工作原理、适用场景与实战选择方法。为什么需要 3 种内置存储在 iOS/macOS 开发中数据存取通常面临三个矛盾速度内存最快、持久性磁盘才不掉、容量管理内存满了要能自动淘汰。Shallows 的设计思路是每种内置存储解决一个核心矛盾再通过组合Composition把它们串成多级缓存。三种存储的定位一表看懂存储类型数据存哪里应用重启后还在吗会自动淘汰吗一句话定位MemoryStorage进程内存字典❌ 丢失❌ 不会最快的内存缓存DiskStorage磁盘文件✅ 保留❌ 不会掉电不丢的持久化NSCacheStorage系统 NSCache❌ 丢失✅ 系统自动系统托管的内存缓存MemoryStorage最快的内存缓存MemoryStorage的实现非常纯粹底层就是一个线程安全的字典ThreadSafe[Key: Value]借助并发队列的 barrier 标志保证多线程读写安全源码见 MemoryStorage.swift。let storage MemoryStorageString, Int().asStorage() // StorageString, Int storage.set(10, forKey: some-key) { _ in } storage.retrieve(forKey: some-key) { result in if let value try? result.get() { print(value) } }特点与注意点⚡ 读写都是纯内存操作速度最快适合高频访问的热点数据 Key 要求HashableValue 可以是任意 Swift 类型⚠️ 数据只存活于进程内App 终止即清空且没有容量上限需自行控制写入量查不到数据时返回MemoryStorageError.noValue错误可配合defaulting(to:)兜底DiskStorage掉电不丢的磁盘持久化DiskStorage基于文件系统实现是所有内置存储中唯一真正持久的一个。它的核心是一个串行队列QoS 为.userInitiated读写操作异步执行、不会阻塞主线程详见 DiskStorage.swift。实际使用时推荐通过folder工厂方法拿到文件夹级存储let diskStorage DiskStorage.main.folder(cities, in: .cachesDirectory) .mapJSONObject(City.self) // StorageFilename, City diskStorage.set(kharkiv, forKey: kharkiv)实用细节 默认自动创建目录creatingDirectories: true写入前会自动补齐不存在的父目录 文件名默认用 Base64 编码器转换避免特殊字符问题可通过filenameEncoder自定义 调用clear()可一键清空整个文件夹设置clearsOnDeinit true后对象销毁时自动清理适合做临时磁盘缓存 速度受磁盘 IO 限制不适合每次都从磁盘读——这正是组合用法的意义NSCacheStorage享受系统自动淘汰的内存缓存NSCacheStorage是对系统NSCache的封装源码位于 NSCacheStorage.swift。相比MemoryStorage它最大的优势是系统会在内存紧张时自动淘汰对象不会把 App 撑爆。它有一个坑需要注意NSCache只支持引用类型ObjC 对象所以 Key 和 Value 必须是NSObject/AnyObject类型。Shallows 贴心地提供了一组便捷扩展来桥接 Swift 原生类型let nscache NSCacheStorageNSURL, NSData() .toNonObjCKeys() .toNonObjCValues() // StorageURL, DatatoNonObjCKeys()和toNonObjCValues()支持NSURL/URL、NSData/Data、NSDate/Date、NSIndexPath/IndexPath等常见类型对如NSString → String几行链式调用就能拿到纯 Swift 类型的存储。适用场景缓存图片二进制数据、大对象等丢了可以再取的数据让系统帮你管理内存压力。实战选择3 种存储怎么选结合三者特性选择逻辑其实很简单你的需求推荐存储理由会话内的临时状态、计数器等MemoryStorage极快进程内存活足够用户数据、配置、下载内容DiskStorage必须跨重启保留图片等大对象、内存敏感场景NSCacheStorage系统自动淘汰防 OOM不确定 / 想要最优体验组合起来兼顾速度 持久性组合玩法一行代码搭出多级缓存 Shallows 最强的能力是把存储组合Composition 实现见 Composition.swift。经典的内存 磁盘二级缓存只需一行let efficient MemoryStorageFilename, UIImage().combined(with: imageStorage)这一行代码背后做了三件事读取时先查MemoryStorage命中即返回快内存未命中则落到DiskStorage读取并回写到内存供下次加速写入时同时写入内存和磁盘保证两边一致除combined(with:)外还有两种更精细的组合方式定义在 Storage.swift 与 Composition.swiftbacked(by:)读取时回退到后端存储但写入不推给后端pushing(to:)读取只查前端存储写入时推送到后端对于只读或只写场景还可以用asReadOnlyStorage()/asWriteOnlyStorage()进一步收窄接口权限。小结选对存储事半功倍 要速度→MemoryStorage纯内存字典 线程安全队列要持久→DiskStorage串行异步 IO自动建目录、可一键清理要省心→NSCacheStorage系统级自动淘汰配合桥接扩展摆脱 ObjC 类型限制都要→ 用combined(with:)组合出多级缓存这正是 Shallows 轻而可组合的设计精髓理解了这三种内置存储的边界与组合方式你就掌握了构建高效缓存/持久化方案的完整工具箱 ️。【免费下载链接】Shallows Your lightweight persistence toolbox项目地址: https://gitcode.com/gh_mirrors/sh/Shallows创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考