我有一个具有以下结构的SwiftUI视图
ScrollView -> LazyVGrid -> ForEach -> BookImage
每个BookImage
收到一个URL
加载的onAppear
struct BookImage: View {
var url: URL?
@State var image: UIImage?
@State var subscription: AnyCancellable?
var body: some View {
Group {
if let image = image {
Image(uiImage: image.vignette(radius: 1, intensity: 1))
.resizable()
} else {
Rectangle().foregroundColor(.gray)
.aspectRatio(0.7, contentMode: .fill)
.overlay(Image(systemName: "questionmark.square").foregroundColor(.white))
}
}
.onAppear() {
if let url = url, image == nil {
subscription = ImageService.shared.image(at: url).assign(to: \.image, on: self)
}
}
}
}
每当我向上或向下滚动时,都会调用onAppear
方法,这是可以的。
我想知道的是为什么每次都加载图像。调用@State var image: UIImage?
方法时,.onAppear
似乎总是为零。
我检查了视图是否在滚动时没有重新初始化/创建,这是完美的,但是我不明白为什么image
总是为零。
有什么主意如何避免用户每次上下滚动时加载图像?
修改
我注意到,即使分配了值,对图像的检查也总是失败。不知道发生了什么。
.onAppear() {
if let url = url, image == nil {
subscription = ImageService.shared.image(at: url).sink { image in
self.image = image
print("\(self.image == nil)")
}
}
}
始终打印真实...