metatext/HTTP/Sources/HTTP/URLSession+Extensions.swift

36 lines
1.3 KiB
Swift
Raw Normal View History

2020-12-17 06:48:06 +00:00
// Copyright © 2020 Metabolist. All rights reserved.
import Combine
import Foundation
extension URLSession {
func dataTaskPublisher(for request: URLRequest, progress: Progress?)
-> AnyPublisher<DataTaskPublisher.Output, Error> {
if let progress = progress {
2021-01-03 23:57:40 +00:00
var dataTaskReference: URLSessionDataTask?
2020-12-17 06:48:06 +00:00
return Deferred {
Future<DataTaskPublisher.Output, Error> { promise in
let dataTask = self.dataTask(with: request) { data, response, error in
if let error = error {
promise(.failure(error))
} else if let data = data, let response = response {
promise(.success((data, response)))
}
}
progress.addChild(dataTask.progress, withPendingUnitCount: 1)
dataTask.resume()
2021-01-03 23:57:40 +00:00
dataTaskReference = dataTask
2020-12-17 06:48:06 +00:00
}
2021-01-03 23:57:40 +00:00
.handleEvents(receiveCancel: {
dataTaskReference?.cancel()
})
2020-12-17 06:48:06 +00:00
}
.eraseToAnyPublisher()
} else {
return dataTaskPublisher(for: request).mapError { $0 as Error }.eraseToAnyPublisher()
}
}
}