Iris 是一个面向 Swift 6.2 的 Apple 平台网络图片库。它使用 async/await、 结构化并发与 Sendable 构建 cache-first 图片 Pipeline,并将缓存、通用展示和 动画播放拆成可独立选择的 Swift Package 产品。
Iris 目前处于
0.1.0-beta.1阶段。首个 beta 用于验证公开边界,后续 beta 仍可能包含 source-breaking 调整。
| Product | 职责 |
|---|---|
Iris |
Core Request、默认网络、ImageIO 静态图/GIF 解码、Pipeline 与工作合并 |
IrisCache |
Cache Key、Store 合同与 Cache facade 配置入口 |
IrisPresentation |
SwiftUI/UIKit 加载 Host、静态默认展示与 Renderer 边界 |
IrisAnimation |
可选的动画播放、Timeline、Player 与 animated Renderer |
只使用 IrisPresentation 时,动态结果会稳定显示即时图片(container.image);
需要播放时再额外依赖 IrisAnimation。
- Swift 6.2+
- iOS 16+
- macOS 13+
- tvOS 16+
- watchOS 9+
- visionOS 1+
SwiftUI 展示支持上述全部平台;UIKit 展示支持 iOS、tvOS 和 visionOS。
在 Package.swift 中加入:
dependencies: [
.package(
url: "https://github.com/Weixi779/Iris.git",
exact: "0.1.0-beta.1"
),
]然后按需选择产品:
.target(
name: "YourApp",
dependencies: [
.product(name: "Iris", package: "Iris"),
.product(name: "IrisPresentation", package: "Iris"),
// 需要动画播放时添加:
.product(name: "IrisAnimation", package: "Iris"),
// 接入自定义缓存 Store 时添加:
.product(name: "IrisCache", package: "Iris"),
]
)import Foundation
import Iris
let pipeline = ImagePipeline(networkProvider: IrisNetworkProvider())
func loadImage(at url: URL) async throws -> ImageContainer {
try await pipeline.image(for: ImageRequest(url: url))
}ImageRequest(url:) 保留原始像素并使用 @1x representation。无 UI 的 Core
不会猜测主屏幕 scale;需要目标尺寸时,应传入已经解析完成的 PixelSize 与
displayScale。
静态默认展示:
import Foundation
import Iris
import IrisPresentation
import SwiftUI
private let imagePipeline = ImagePipeline(
networkProvider: IrisNetworkProvider()
)
struct RemoteCover: View {
private let imageURL = URL(
string: "https://example.com/image.jpg"
)!
var body: some View {
NetworkImage(
imageURL,
target: CGSize(width: 160, height: 160),
pipeline: imagePipeline
)
}
}target 使用 point 表达展示意图;IrisPresentation 会结合当前环境的
display scale,将它解析为最大输出像素边界。
选择动画播放:
import IrisAnimation
struct AnimatedRemoteCover: View {
let imageURL: URL
var body: some View {
NetworkImage(
imageURL,
target: CGSize(width: 160, height: 160),
pipeline: imagePipeline,
renderer: AnimatedNetworkImageRenderer()
)
}
}UIKit 可使用 NetworkImageView,并通过 AnimatedImageViewRenderer 选择动画播放。
IrisCache 当前提供 ImageStoring、ImageDataStoring、CacheKeyProviding 以及
把它们配置为 Pipeline Cache facade 的入口。首个 beta 不提供默认 Memory/Disk
Store;Store 的容量、淘汰、过期、并发安全和物理 Key 编码由接入方负责。
首个 beta 已包含 cache-first 加载、网络与解码工作合并、ImageIO 静态图/GIF 解码、SwiftUI/UIKit 静态展示,以及可选动画播放。
本次 beta 不包含:
- 默认 Memory/Disk Cache Store;
- SVG、QOI 等额外格式及格式插件注册表;
- Image Processor;
- Progress、Profiler 与公开事件流;
- Retry、placeholder、transition 和自动 View 尺寸测量;
- 视频加载与播放。
动画播放不会自动采用 Reduce Motion 策略;应用可以通过
AnimatedNetworkImageRenderer(playsAnimation:) 自行决定是否播放。
这些能力不会阻塞 0.1.0-beta.1,只会在出现真实 Consumer 后重新评估。
Iris 使用 MIT License。