Skip to content

Instantly share code, notes, and snippets.

@joemasilotti
Last active November 21, 2016 19:03
Show Gist options
  • Select an option

  • Save joemasilotti/c1a2ad4fd95411f445f0 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown

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
Copy Markdown

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
Copy Markdown
Author

This does work, thanks @briancroom!

@ltrainpr

ltrainpr commented Nov 21, 2016

Copy link
Copy Markdown

@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