はじめに
Combineを使って画像URLから画像を読み込む実装を試したので記事に残します。
開発環境
- macOS Big Sur 11.3.1
- Xcode 12.5
- Swift 5.4
実装
@Published var image: UIImage? private let url: URL private var cancellables = Set<AnyCancellable>() private func fetchImage(url: URL) -> Future<UIImage, Never> { return Future<UIImage, Never> { promise in URLSession.shared.dataTaskPublisher(for: url) .map { UIImage(data: $0.data) } .replaceError(with: nil) .handleEvents( receiveSubscription: { [weak self] _ in self?.onStart() }, receiveCompletion: { [weak self] _ in self?.onFinish() } ) .sink(receiveValue: { promise(.success($0!)) }) .store(in: &self.cancellables) } }
以下のようにして呼び出すイメージ。
fetchImage(url: url) .receive(on: DispatchQueue.main) .sink(receiveValue: { self.image = $0 }) .store(in: &cancellables)
おわりに
Combineはもっと実装(試行)回数増やして理解していかなければ・・・。