AsyncImage не отображает все изображения в списке и создает код ошибки =-999 «отменено»

У меня возникли проблемы с отображением всех изображений в списке с помощью AsyncImage. Когда вы впервые запускаете приложение, оно выглядит нормально, но если вы начинаете прокручивать, некоторые изображения не отображаются. Либо ProgressView не обновляется до тех пор, пока строка не будет прокручена за пределы экрана и не вернется в поле зрения, либо я получаю код ошибки =-999 «отменено».

Я могу заставить все изображения отображаться, а ProgressView правильно обновлять, используя обычное представление изображений и выполняя весь процесс установки загрузки и отображения изображения. Только когда я пытаюсь использовать AsyncImage, все изображения не отображаются. Как я могу заставить все AsyncImages отображаться в списке?

      struct ContentView: View {
    
    @StateObject private var viewModel = ListViewModel()
    
    var body: some View {
        List {
            ForEach(viewModel.images) { photo in
                HStack {
                    AsyncImage(url: URL(string: photo.thumbnailUrl)) { phase in
                        switch phase {
                        case .success(let image):
                            image
                        case .failure(let error):
                            let _ = print(error)
                            Text("error: \(error.localizedDescription)")
                        case .empty:
                            ProgressView()
                        @unknown default:
                            fatalError()
                        }
                    }
                    
                    VStack(alignment: .leading) {
                        Text(photo.title)
                        Text(photo.thumbnailUrl)
                    }
                }
            }
        }
        .task {
            await viewModel.loadImages()
        }
    }
}

@MainActor 
class ListViewModel: ObservableObject {
    
    @Published var images: [PhotoObject] = []
    
    func loadImages() async {
        do {
            let photos = try await AsyncImageManager.downloadImages()
                images = photos
        } catch {
            print("Could load photos: \(error)")
        }
    }
    
}

struct AsyncImageManager {
    
    static func downloadImages() async throws -> [PhotoObject] {
        let url = URL(string: "https://jsonplaceholder.typicode.com/photos")!
        
        let (data, _) = try await URLSession.shared.data(from: url)
        return try JSONDecoder().decode([PhotoObject].self, from: data)
    }
}

struct PhotoObject: Identifiable, Codable {
    let albumId: Int
    let id: Int
    let title: String
    let url: String
    let thumbnailUrl: String
}

0 ответов

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