Swift・iOS

Swiftを中心に学んだことを記録に残すブログです。技術に関係ない記事もたまに書いています。

【Combine】画像URLから画像を読み込む

 

はじめに

Combineを使って画像URLから画像を読み込む実装を試したので記事に残します。

 

開発環境

 

実装

@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はもっと実装(試行)回数増やして理解していかなければ・・・。

 

参考