Skip to content

Instantly share code, notes, and snippets.

@T1T4N
Last active May 2, 2023 07:39
Show Gist options
  • Save T1T4N/bca1420421028c574386278753c9b7a3 to your computer and use it in GitHub Desktop.
Save T1T4N/bca1420421028c574386278753c9b7a3 to your computer and use it in GitHub Desktop.
Emulating a DataTaskPublisher with Progress
#if canImport(Combine)
import Foundation
import Combine
@available(OSX 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension URLSession {
public typealias DataTaskProgressPublisher =
(progress: Progress, publisher: AnyPublisher<DataTaskPublisher.Output, Error>)
public func dataTaskProgressPublisher(for request: URLRequest) -> DataTaskProgressPublisher {
let progress = Progress(totalUnitCount: 1)
let result = Deferred {
Future<DataTaskPublisher.Output, Error> { handler in
let task = self.dataTask(with: request) { (data, response, error) in
if let error = error {
handler(.failure(error))
} else if let data = data, let response = response {
handler(.success((data, response)))
}
}
progress.addChild(task.progress, withPendingUnitCount: 1)
task.resume()
}
}
return (progress, result.eraseToAnyPublisher())
}
@inlinable
public func dataTaskProgressPublisher(for url: URL) -> DataTaskProgressPublisher {
self.dataTaskProgressPublisher(for: .init(url: url))
}
}
#endif //canImport(Combine)
@leolelego
Copy link

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment