在Xcode中创建一个名为AsyncImageApp的SwiftUI项目。
两个要素:一个ImageFetcher类,用于从网络中检索图像;
以及一个AsyncImage视图,用于在SwiftUI中呈现它。


1.让我们从定义ImageFetcher类开始。它是一个ObservableObject,并且具有一个已发布的变量,即可选的下载图像:
import Combine
class ImageFetcher: ObservableObject {
@Published
private(set) var image: UIImage?
private let url: URL
private var cancellable: AnyCancellable?
init(url: URL) {
self.url = url
}
func start() {
cancellable = URLSession(configuration: .default)
.dataTaskPublisher(for: url)
.map { UIImage(data: $0.data) }
.replaceError(with: nil)
.receive(on: DispatchQueue.main)
.assign(to: \.image, on: self)
}
func stop() {
cancellable?.cancel()
}
deinit {
cancellable?.cancel()
}
}
2.定义了公共接口后,我们以合并的方式实现了完成所有工作的start()函数:
网友评论