import SwiftUI import Combine // 1. Класс для загрузки изображения class ImageLoader: ObservableObject { @Published var image: UIImage? private var cancellable: AnyCancellable? private let url: URL init(url: URL) { self.url = url } deinit { cancellable?.cancel() } func load() { cancellable = URLSession.shared.dataTaskPublisher(for: url) .map { UIImage(data: $0.data) } .replaceError(with: nil) .receive(on: DispatchQueue.main) .assign(to: \.image, on: self) } func cancel() { cancellable?.cancel() } } // 2. View для отображения удаленного изображения struct RemoteImageView: View { @StateObject private var loader: ImageLoader private let placeholder: Image init(url: URL, placeholder: Image = Image("placeholderPhoto")) { _loader = StateObject(wrappedValue: ImageLoader(url: url)) self.placeholder = placeholder } var body: some View { content .onAppear(perform: loader.load) .onDisappear(perform: loader.cancel) } private var content: some View { Group { if let image = loader.image { Image(uiImage: image) .resizable() } else { placeholder .resizable() } } } }