Skip to content

Instantly share code, notes, and snippets.

@joemasilotti
Last active November 21, 2016 19:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joemasilotti/c1a2ad4fd95411f445f0 to your computer and use it in GitHub Desktop.
Save joemasilotti/c1a2ad4fd95411f445f0 to your computer and use it in GitHub Desktop.
Trying to mock NSURLConnection
protocol URLSessionDataTaskProtocol {
func resume()
}
extension NSURLSessionDataTask: URLSessionDataTaskProtocol { }
typealias DataTaskResult = (NSData?, NSURLResponse?, NSError?) -> Void
protocol URLSessionProtocol {
func dataTaskWithURL(url: NSURL, completionHandler: DataTaskResult) -> URLSessionDataTaskProtocol
}
extension NSURLSession: URLSessionProtocol { } // ERROR: Type 'NSURLSession' does not conform to protocol 'URLSessionProtocol'
@eliperkins
Copy link

I don't have complete context around this, but I think this gets you most of the way there:

//: Playground - noun: a place where people can play

import Foundation

protocol URLSessionDataTaskProtocol {
    func resume()
}

extension NSURLSessionDataTask: URLSessionDataTaskProtocol { }

typealias DataTaskResult = (NSData?, NSURLResponse?, NSError?) -> Void

protocol URLSessionProtocol {
    typealias Task
    func dataTaskWithURL(url: NSURL, completionHandler: DataTaskResult) -> Task
}

extension NSURLSession: URLSessionProtocol { }

@briancroom
Copy link

Cool idea with the typealias, @eliperkins. I think the drawback to that approach is that it prevents URLSessionProtocol from being used as a concrete type, so a client wanting to use the service would have to become generic.

I'd suggest this variation for @joemasilotti:

protocol URLSessionDataTaskProtocol {
    func resume()
}

extension NSURLSessionTask: URLSessionDataTaskProtocol {}

protocol URLSessionProtocol {
    func dataTaskWithURL(url: NSURL, completionHandler: DataTaskResult) -> URLSessionDataTaskProtocol
}

typealias DataTaskResult = (NSData?, NSURLResponse?, NSError?) -> Void

extension NSURLSession: URLSessionProtocol {
    func dataTaskWithURL(url: NSURL, completionHandler: DataTaskResult) -> URLSessionDataTaskProtocol {
        return (dataTaskWithURL(url, completionHandler: completionHandler) as NSURLSessionDataTask) as URLSessionDataTaskProtocol
    }
}


func useSession(session: URLSessionProtocol) {
    session.dataTaskWithURL(NSURL(string: "http://apple.com")!, completionHandler: { (data, response, error) in
        print("Data: \(data), response: \(response), error: \(error)")
    }).resume()
}

useSession(NSURLSession(configuration: .defaultSessionConfiguration()))

@joemasilotti
Copy link
Author

This does work, thanks @briancroom!

@ltrainpr
Copy link

ltrainpr commented Nov 21, 2016

@briancroom @joemasilotti Do you guys have Swift 3 version of this? I'm getting a Type 'URLSession' does not conform to protocol 'URLSessionProtocol' on the extension URLSession: URLSessionProtocol line.

Also getting Expressions are not allowed at the top level on useSession( line.

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