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)")
                }
            }
        }

始终打印真实...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)