асинхронное изображение в SwiftUI

Я работаю над API, в котором я извлекаю тексты, но изображение из API не отображается внутри представления. Я дал ему асинхронное изображение. Асинхронное изображение отображается в представлении серой частью. Пожалуйста, дайте мне знать, чего здесь не хватает. Было бы здорово, если бы кто-нибудь помог мне с этим.

Модальный API как:

      struct priceRange: Codable {
    let status: String
    let record: Record
}

struct Record: Codable {
    let propertytype: [Property]
    let placetype: [Place]
    let floorplan: [Floor]
    let amenity: [Amenity]
    let path: String
}

struct Property: Codable {
    let type: String
    let image: String
    let status: String
    let id: Int
}

Мой сетевой код идет здесь:

      class PRViewModel: ObservableObject {
    
    @Published var floors = [Floor]()
    @Published var place = [Place]()
    @Published var prop = [Property]()
    @Published var res = [Amenity]()
    @Published private(set) var exp: priceRange?
    @Published private(set) var rec: Record?
    
    func loadData(){
        
        guard let url = URL(string: PR_data) else {
            print("Invalid URL")
            return
        }
        var request = URLRequest(url: url)
        
        request.httpMethod = "GET"
        
        URLSession.shared.dataTask(with: request) {(data, response, error) in
            do {
                if let todoData = data {
                    let decodedData = try JSONDecoder().decode(priceRange.self, from: todoData)
                    DispatchQueue.main.async {
                        self.res = decodedData.record.amenity
                        self.prop = decodedData.record.propertytype
                        self.floors = decodedData.record.floorplan
                        self.place = decodedData.record.placetype
                        print(decodedData.status)
                        //print(decodedData.record.path!)
                    }
                } else {
                    print("No data")
                }
            } catch {
                print(error)
            }
        }.resume()
    }
}

Код списка идет здесь:

      struct Price_range: View {
    
    @StateObject var viewModel = PRViewModel()
    
    var body: some View {
        List(viewModel.prop, id: \.type) { item in
            Text(item.type)
            AsyncImage(url: URL(string: PR_URL + (viewModel.rec?.path ?? "") + "/" + item.image))
        }
        .onAppear {
            viewModel.loadData()
        }
    }
}

Редактировать:

      AsyncImage(url: URL(string: PR_URL + (viewModel.exp?.record.path ?? "") + "/" + item.image))

это все еще остается тем же самым. Я хочу вывести эту переменную «путь» в модальном окне «запись» в представление?

1 ответ

Как уже отмечалось в комментариях, вы никогда не присваиваете никакого значенияexpиresпоэтому они остаются нулевыми. Вы можете назначить их, пока вы назначаете свои предыдущие свойства:

      do {
    if let todoData = data {
        let decodedData = try JSONDecoder().decode(priceRange.self, from: todoData)
        DispatchQueue.main.async {
            self.exp = decodedData // this
            self.rec = decodedData.record // and this
            self.res = decodedData.record.amenity
            self.prop = decodedData.record.propertytype
            self.floors = decodedData.record.floorplan
            self.place = decodedData.record.placetype
            print(decodedData.status)
            //print(decodedData.record.path!)
        }
    } else {
        print("No data")
    }
} catch {
    print(error)
}

а затем выполните:

      AsyncImage(url: URL(string: PR_URL + (viewModel.rec?.path ?? "") + "/" + item.image))

если проблема все еще существует, попробуйте проверить, действительна ли ваша ссылка, используя:

      let _ = print(PR_URL + (viewModel.rec?.path ?? "") + "/" + item.image)

прямо перед строкой сAsyncImage.

Другие вопросы по тегам