在SwiftUI中,有一些.init创建图像的方法,但是它们都不允许使用块或任何其他方式从网络/缓存加载UIImage ...
我正在使用Kingfisher从网络加载图像并在列表行中缓存,但是在视图中绘制图像的方法是再次重新渲染它,我不想这样做。另外,在获取图像时,我正在创建一个假图像(仅彩色)作为占位符。另一种方法是将所有内容包装在自定义视图中,然后仅重新渲染包装器。但是我还没有尝试过。
此示例现在正在工作。任何改善当前想法的想法都会很棒
使用加载程序的某些视图
struct SampleView : View {
@ObjectBinding let imageLoader: ImageLoader
init(imageLoader: ImageLoader) {
self.imageLoader = imageLoader
}
var body: some View {
Image(uiImage: imageLoader.image(for: "https://url-for-image"))
.frame(width: 128, height: 128)
.aspectRatio(contentMode: ContentMode.fit)
}
}
Run Code Online (Sandbox Code Playgroud)
import UIKit.UIImage
import SwiftUI
import Combine
import class Kingfisher.ImageDownloader
import struct Kingfisher.DownloadTask
import class Kingfisher.ImageCache
import class Kingfisher.KingfisherManager
class ImageLoader: BindableObject {
var didChange = PassthroughSubject<ImageLoader, Never>()
private let downloader: ImageDownloader
private let cache: ImageCache
private var image: UIImage? …Run Code Online (Sandbox Code Playgroud) 我正在使用Combine 和SwiftUI 来做一些异步的事情,关键是我不知道如何从主线程中的异步操作接收响应。在苹果的文档说,它可以使用的RunLoop.main,但目前雨燕5.0是不是调度。那么对此有什么想法吗?
我试图按照苹果文档使用,但没有运气。
anyPublisher
.receiveOn(on: RunLoop.main)
Run Code Online (Sandbox Code Playgroud)