SwiftUI在滚动视图项目中加载图像

时间:2020-08-16 10:33:57

标签: swiftui

我有一个具有以下结构的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)")
                }
            }
        }

始终打印真实...

0 个答案:

没有答案