简体   繁体   English

SWIFTUI Observable Object 数据任务只运行一次?

[英]SWIFTUI Observable Object Data Task only runs once?

I have an observable object class that downloads an image from a url to display:我有一个可观察的 object class 从 url 下载图像以显示:

class ImageLoader : ObservableObject {
var didChange = PassthroughSubject<Data, Never>()
var data = Data() {
    didSet {
        didChange.send(data)
    }
}
init(urlString:String){
    guard let url = URL(string: urlString) else {return}
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data else { return }
        DispatchQueue.main.async {
            self.data = data
            print("imageloader1")
        }
    }
    task.resume()
}

and I show it using:我使用以下方法展示它:

struct ShowImage1: View {
@ObservedObject var imageLoader:ImageLoader
@State var image:UIImage = UIImage()

init(withURL url:String) {
    imageLoader = ImageLoader(urlString:url)
}

var body: some View {
    Image(uiImage: image)
    .resizable()
    .aspectRatio(contentMode: .fit)
    .edgesIgnoringSafeArea(.top)
    .onReceive(imageLoader.didChange) {
            data in self.image = UIImage(data: data) ?? UIImage()
    }
}

The problem I'm having is this is only capable of running once, If i click off the ShowImage1 view and then click back on to it, ImageLoader doesn't run again, and I'm left with a blank page.我遇到的问题是它只能运行一次,如果我单击ShowImage1视图然后单击返回它, ImageLoader不会再次运行,我会留下一个空白页。

How can I ensure that ImageLoader Runs every time the ShowImage1 view is accessed?如何确保每次访问ShowImage1视图时ImageLoader运行?

EDIT:编辑:

I access ShowImage1 like this:我像这样访问 ShowImage1 :

struct PostCallForm: View {
  var body: some View {
    NavigationView {
        Form {
            Section {
                    Button(action: {
                        if true {
                            self.showImage1 = true
                        }
                    }){
                        Text("View Camera 1 Snapshot")
                    }.overlay(NavigationLink(destination: ShowImage1(withURL: "example.com/1.jpg"), isActive: self.$showImage1, label: {
                            EmptyView()
                        }))
                }

            }
            Section {
                Button(action: {
                }){
                    Text("Submit")
                    }
                }
            }.disabled(!submission.isValid)
        }

} } } }

import SwiftUI
import Combine
class ImageLoader : ObservableObject {
    var didChange = PassthroughSubject<Data, Never>()
    var data = Data() {
        didSet {
            didChange.send(data)
        }
    }
    
    func loadImage(urlString:String) {
        guard let url = URL(string: urlString) else {return}
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data else { return }
            DispatchQueue.main.async {
                self.data = data
                print("imageloader1")
            }
        }
        task.resume()
    }
}
struct ShowImage1Parent: View {
    
    @State var url: String = ""
    var sampleURLs: [String] = ["https://image.shutterstock.com/image-vector/click-here-stamp-square-grunge-600w-1510095275.jpg", "https://image.shutterstock.com/image-vector/certified-rubber-stamp-red-grunge-600w-1423389728.jpg", "https://image.shutterstock.com/image-vector/sample-stamp-square-grunge-sign-600w-1474408826.jpg" ]
    
    
    var body: some View {
        VStack{
            Button("load-image", action: {
                url =  sampleURLs.randomElement()!
            })
            ShowImage1(url: $url)
        }
    }
}
struct ShowImage1: View {
    @StateObject var imageLoader:ImageLoader = ImageLoader()
    @State var image:UIImage = UIImage()
    @Binding var url: String
    
    var body: some View {
        VStack{
            Image(uiImage: image)
                .resizable()
                .aspectRatio(contentMode: .fit)
                .edgesIgnoringSafeArea(.top)
                .onReceive(imageLoader.didChange) {
                    data in self.image = UIImage(data: data) ?? UIImage()
                }
                .onChange(of: url, perform: { value in
                    imageLoader.loadImage(urlString: value)
                })
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM