Skip to content

Commit

Permalink
add cancelability to apollo requests (#9)
Browse files Browse the repository at this point in the history
  • Loading branch information
jamiepinkham authored and martijnwalraven committed Oct 20, 2016
1 parent 886bea0 commit 3ca0342
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 6 deletions.
12 changes: 8 additions & 4 deletions Sources/ApolloClient.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import Foundation

public protocol Cancellable {
func cancel()
}

public class ApolloClient {
let networkTransport: NetworkTransport

Expand All @@ -11,16 +15,16 @@ public class ApolloClient {
self.init(networkTransport: HTTPNetworkTransport(url: url))
}

public func fetch<Query: GraphQLQuery>(query: Query, queue: DispatchQueue = DispatchQueue.main, completionHandler: @escaping GraphQLOperationResponseHandler<Query>) {
networkTransport.send(operation: query) { (result, error) in
public func fetch<Query: GraphQLQuery>(query: Query, queue: DispatchQueue = DispatchQueue.main, completionHandler: @escaping GraphQLOperationResponseHandler<Query>) -> Cancellable {
return networkTransport.send(operation: query) { (result, error) in
queue.async {
completionHandler(result, error)
}
}
}

public func perform<Mutation: GraphQLMutation>(mutation: Mutation, queue: DispatchQueue = DispatchQueue.main, completionHandler: @escaping GraphQLOperationResponseHandler<Mutation>) {
networkTransport.send(operation: mutation) { (result, error) in
public func perform<Mutation: GraphQLMutation>(mutation: Mutation, queue: DispatchQueue = DispatchQueue.main, completionHandler: @escaping GraphQLOperationResponseHandler<Mutation>) -> Cancellable {
return networkTransport.send(operation: mutation) { (result, error) in
queue.async {
completionHandler(result, error)
}
Expand Down
7 changes: 5 additions & 2 deletions Sources/NetworkTransport.swift
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import Foundation

public protocol NetworkTransport {
func send<Operation: GraphQLOperation>(operation: Operation, completionHandler: @escaping GraphQLOperationResponseHandler<Operation>)
func send<Operation: GraphQLOperation>(operation: Operation, completionHandler: @escaping GraphQLOperationResponseHandler<Operation>) -> Cancellable
}

extension URLSessionTask : Cancellable { }

struct GraphQLResponseError: Error, LocalizedError {
enum ErrorKind {
case errorResponse
Expand Down Expand Up @@ -50,7 +52,7 @@ public class HTTPNetworkTransport: NetworkTransport {
self.session = URLSession(configuration: configuration)
}

public func send<Operation: GraphQLOperation>(operation: Operation, completionHandler: @escaping GraphQLOperationResponseHandler<Operation>) {
public func send<Operation: GraphQLOperation>(operation: Operation, completionHandler: @escaping GraphQLOperationResponseHandler<Operation>) -> Cancellable {
var request = URLRequest(url: url)
request.httpMethod = "POST"

Expand Down Expand Up @@ -88,6 +90,7 @@ public class HTTPNetworkTransport: NetworkTransport {
}
}
task.resume()
return task
}

private func parseResult<Data: GraphQLMapDecodable>(responseMap: GraphQLMap) throws -> GraphQLResult<Data> {
Expand Down

0 comments on commit 3ca0342

Please sign in to comment.