微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。