AsyncDownSamplingImage

AsyncDownSamplingImage 是一个 SwiftUI 组件,它具有与原始 AsyncImage 类似的接口,并且可以执行降采样,从而减少用于存储从服务器获取的图像数据的内存缓冲区。

降采样的影响

通过降采样,我们可以减少大量的内存使用,如下所示。

默认 AsyncImage AsyncDownSamplingImage(效率提高 2~3 倍)
Screenshot 2023-02-03 at 21 58 31 Screenshot 2023-02-03 at 21 58 48

而且,图像数量越多,我们获得的收益就越大。

下面是我滚动并显示 100/1000 张高分辨率图像 (1000×1000px) 时的比较。 使用 AsyncDownSamplingImage,我们将图像大小从 1000x1000 更改为 160x160,这与渲染的 Image 大小相同。

100 个默认 AsyncImage 100 个 AsyncDownSamplingImage(效率提高 10 倍以上)
Screenshot 2023-02-04 at 2 11 31 Screenshot 2023-02-04 at 2 12 06
1000 个默认 AsyncImage 1000 个 AsyncDownSamplingImage(效率提高 30 倍以上)
Screenshot 2023-02-06 at 1 08 46 Screenshot 2023-02-06 at 1 07 29

安装

.package(url: "https://github.com/fummicc1/AsyncDownSamplingImage.git", from: "1.1.0")

如何使用 AsyncDownSamplingImage

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

IncrementalImage 是一个可以分块加载图像数据的组件。 缓冲区的大小由 bufferSize 参数设置,单位为字节。

let url = URL(string: "https://via.placeholder.com/1000")

IncrementalImage(url: url, bufferSize: 1 * 1024)

DocC

DocC 生成的文档 可用(仍在开发中)。

贡献

欢迎提交 Pull 请求、错误报告和功能请求 🚀

许可证

MIT 许可证

参考