Skip to content

Instantly share code, notes, and snippets.

@yamoridon
Created June 10, 2019 15:16
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yamoridon/16c1cc70ac46e50def4ca6695ceff772 to your computer and use it in GitHub Desktop.
Save yamoridon/16c1cc70ac46e50def4ca6695ceff772 to your computer and use it in GitHub Desktop.
DataTaskPublisherを作ってみた
import Foundation
import Combine
struct DataTaskSubscription: Subscription {
let task: URLSessionTask
let combineIdentifier: CombineIdentifier
func request(_ demand: Subscribers.Demand) {
}
func cancel() {
task.cancel()
}
}
struct DataTaskPublisher: Publisher {
let session: URLSession
let request: URLRequest
public typealias Output = (data: Data, response: URLResponse)
public typealias Failure = URLError
public func receive<S>(subscriber: S) where S : Subscriber, Failure == S.Failure, Output == S.Input {
let task = session.dataTask(with: request) { data, response, error in
if let error = error {
assert(error is URLError)
subscriber.receive(completion: .failure(error as! URLError))
return
}
_ = subscriber.receive((data!, response!))
subscriber.receive(completion: .finished)
}
let subscription = DataTaskSubscription(task: task, combineIdentifier: CombineIdentifier())
subscriber.receive(subscription: subscription)
task.resume()
}
}
extension URLSession {
func dataTaskPublisher(for request: URLRequest) -> DataTaskPublisher {
DataTaskPublisher(session: self, request: request)
}
}
@niazoff
Copy link

niazoff commented Jun 13, 2019

クール!

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