SwiftUI 使用 Kingfisher 网络图像缓存下载库的详细示例与API说明

Kingfisher 是一个轻量级、纯 Swift 实现的异步下载和缓存图片的库,github 介绍中提到了以下一些特性:

  • 下载高分辨率的图像;
  • 向下采样以匹配图像视图的大小;
  • 使它在给定的半径内被旋转到倾斜;
  • 在下载时显示进度指示器和占位符图像;
  • 下载图像准备好后,会以“淡出”效果展示图像动画;
  • 原始图像能被缓存到磁盘以供以后使用,方便在详细视图中等再次利用;
  • 任务下载进行中进度、下载完成、下载失败都能提供自定义操作;

添加Kingfisher库

推荐 Swift Package Manager (SPM) 方式,如出现加载困难可阅读《 解决Xcode中SPM加载卡慢问题
  • File > Swift Packages > Add Package Dependency
  • 右上角输入 https://github.com/onevcat/Kingfisher.git
  • 选择 “Up to Next Major” -> “7.0.0”
  • 确认导入

使用示例

import Kingfisher

    let customDownloader = ImageDownloader(name: "MyImgDownloader")
    let customCache = ImageCache(name: "offlineCache")
    
    var body: some View {
        KFImage(URL(string: "https://www.codeun.com/logo.png"))
            // 调整渲染模式
            .renderingMode(.template)
            // 图像加载时展示默认占位图
            .placeholder {
                Image(systemName: "placeholder")
                    .resizable()
                    .scaledToFit()
                    .opacity(0.3)
            }
            // 也可以在图像加载时展示进度指示器
            // .placeholder {
            //      ProgressView()
            // }
            // 加载完成后淡入效果
            .fade(duration: 0.5)
            // 使用缓存策略
            .cacheMemoryOnly()
            // 使用刷新策略
            // .forceRefresh()
            // 图像加载进度
            .onProgress { receivedSize, totalSize in
                print("总大小:\(totalSize) - 已接受:\(receivedSize)")
            }
            // 图像加载完成
            .onSuccess { result in
                print("\(result.image) - \(result.cacheType)")
            }
            .onFailure { error in
                print("\(error)")
            }
            // 目标缓存
            .targetCache(customCache)
            // 使用自定义下载器
            .downloader(customDownloader)
            .resizable()
            .scaledToFit()
        
            .scaleEffect(0.9)
            .animation(.easeInOut(duration: 0.5))
            // 圆角
            .clipShape(RoundedRectangle(cornerRadius: 12))
            // 边框
            .overlay(RoundedRectangle(cornerRadius: 12).stroke(Color.green, lineWidth: 2))
    }
}

其他部分 API 说明

  • 禁用磁盘缓存:.memoryCacheExpiration(.never)
  • 设置磁盘缓存有效期:.diskCacheExpiration(.days(1))
  • 设置加载图像优先级队列: .downloadPriority(0.5)
  • 设置重试策略:.retryStrategy()
  • 自定义缩略图大小: .thumbnail(size: CGSize(width: 50, height: 50))

再来一个示例

自定义图片下载request请求设置 (header, Authorization, token 等)
根据网络状态设置 placeholder 和 缓存方式
@Environment(\.networkState) var networkState: NetworkState

let myDownloader = ImageDownloader(name: "myDownloader")
let myCache = ImageCache(name: "myCache")
let customKF = KingfisherManager(downloader: myDownloader, cache: myCache)

// 自定义图片下载request请求设置
let options: KingfisherOptionsInfo = [
    .requestModifier(ImageDownloadRequestModifier(modify: { request in
        var newRequest = request
        newRequest.addValue("Bearer mock_token", forHTTPHeaderField: "Authorization")
        newRequest.addValue("codeun_app", forHTTPHeaderField: "UserAgent")
        return newRequest
    }))
]



KFImage(URL(string: "https://example.com/image.jpg"))
    .placeholder {
        if networkState.isOffline {
            Text("无法加载图片,请检查网络连接")
        } else {
            ProgressView()
        }
    }
    .cacheStrategy(networkState.isOffline ? .memoryOnly : .default)

  本文自 https://www.codeun.com 发布,相应代码均自主编写并严格审阅和测试,完整代码中包含丰富的学习笔记和使用方式、实用技巧。
  · 如若转载,请注明出处:https://www.codeun.com/archives/1036.html ·

(0)
上一篇 2023-04-07 上午10:36
下一篇 2023-04-10 下午2:37

发表回复

登录后才能评论