AsyncDownSamplingImage
是一个 SwiftUI 组件,它具有与原始 AsyncImage 类似的接口,并且可以执行降采样,从而减少用于存储从服务器获取的图像数据的内存缓冲区。
通过降采样,我们可以减少大量的内存使用,如下所示。
默认 AsyncImage | AsyncDownSamplingImage(效率提高 2~3 倍) |
---|---|
![]() |
![]() |
而且,图像数量越多,我们获得的收益就越大。
下面是我滚动并显示 100/1000 张高分辨率图像 (1000×1000px) 时的比较。 使用 AsyncDownSamplingImage,我们将图像大小从 1000x1000
更改为 160x160
,这与渲染的 Image
大小相同。
100 个默认 AsyncImage | 100 个 AsyncDownSamplingImage(效率提高 10 倍以上) |
---|---|
![]() |
![]() |
1000 个默认 AsyncImage | 1000 个 AsyncDownSamplingImage(效率提高 30 倍以上) |
---|---|
![]() |
![]() |
.package(url: "https://github.com/fummicc1/AsyncDownSamplingImage.git", from: "1.1.0")
AsyncDownSamplingImage
的目标是以类似于 AsyncImage
的方式使用,即使实现方式不同。
public init(
url: Binding<URL?>,
downsampleSize: Binding<CGSize>,
content: @escaping (Image) -> Content,
placeholder: @escaping () -> Placeholder,
fail: @escaping (Error) -> Fail
)
public init(
url: URL?,
downsampleSize: Binding<CGSize>,
content: @escaping (Image) -> Content,
fail: @escaping (Error) -> Fail
)
public init(
url: URL?,
downsampleSize: CGSize,
content: @escaping (Image) -> Content,
fail: @escaping (Error) -> Fail
)
您可以按以下方式使用 AsyncDownSamplingImage
。
@State private var url = URL(string: "https://via.placeholder.com/1000")
@State private var size: CGSize = .init(width: 160, height: 160)
...
AsyncDownSamplingImage(
url: url,
downsampleSize: size
) { image in
image.resizable()
.frame(width: size.width, height: size.height)
} fail: { error in
Text("Error: \(error.localizedDescription)")
}
IncrementalImage 是一个可以分块加载图像数据的组件。 缓冲区的大小由 bufferSize
参数设置,单位为字节。
let url = URL(string: "https://via.placeholder.com/1000")
IncrementalImage(url: url, bufferSize: 1 * 1024)
DocC 生成的文档 可用(仍在开发中)。
欢迎提交 Pull 请求、错误报告和功能请求 🚀