-
Notifications
You must be signed in to change notification settings - Fork 662
/
ImageWebRepository.swift
47 lines (40 loc) · 1.32 KB
/
ImageWebRepository.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//
// ImageWebRepository.swift
// CountriesSwiftUI
//
// Created by Alexey Naumov on 09.11.2019.
// Copyright © 2019 Alexey Naumov. All rights reserved.
//
import Combine
import UIKit
protocol ImageWebRepository: WebRepository {
func load(imageURL: URL) -> AnyPublisher<UIImage, Error>
}
struct RealImageWebRepository: ImageWebRepository {
let session: URLSession
let baseURL: String
let bgQueue = DispatchQueue(label: "bg_parse_queue")
init(session: URLSession, baseURL: String) {
self.session = session
self.baseURL = baseURL
}
func load(imageURL: URL) -> AnyPublisher<UIImage, Error> {
return download(rawImageURL: imageURL)
.subscribe(on: bgQueue)
.receive(on: DispatchQueue.main)
.extractUnderlyingError()
.eraseToAnyPublisher()
}
private func download(rawImageURL: URL) -> AnyPublisher<UIImage, Error> {
let urlRequest = URLRequest(url: rawImageURL)
return session.dataTaskPublisher(for: urlRequest)
.requestData()
.tryMap { data -> UIImage in
guard let image = UIImage(data: data) else {
throw APIError.imageDeserialization
}
return image
}
.eraseToAnyPublisher()
}
}