// // NSURLSession+Synchronous.swift // mas-cli // // Created by Michael Schneider on 4/14/16. // Copyright © 2016 Andrew Naylor. All rights reserved. // // Synchronous NSURLSession code found at: http://ericasadun.com/2015/11/12/more-bad-things-synchronous-nsurlsessions/ import Foundation /// NSURLSession synchronous behavior /// Particularly for playground sessions that need to run sequentially public extension NSURLSession { /// Return data from synchronous URL request public static func requestSynchronousData(request: NSURLRequest) -> NSData? { var data: NSData? = nil let semaphore: dispatch_semaphore_t = dispatch_semaphore_create(0) let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { taskData, _, error -> () in data = taskData if data == nil, let error = error {print(error)} dispatch_semaphore_signal(semaphore); }) task.resume() dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) return data } /// Return data synchronous from specified endpoint public static func requestSynchronousDataWithURLString(requestString: String) -> NSData? { guard let url = NSURL(string:requestString) else {return nil} let request = NSURLRequest(URL: url) return NSURLSession.requestSynchronousData(request) } /// Return JSON synchronous from URL request public static func requestSynchronousJSON(request: NSURLRequest) -> AnyObject? { guard let data = NSURLSession.requestSynchronousData(request) else {return nil} return try? NSJSONSerialization.JSONObjectWithData(data, options: []) } /// Return JSON synchronous from specified endpoint public static func requestSynchronousJSONWithURLString(requestString: String) -> AnyObject? { guard let url = NSURL(string: requestString) else {return nil} let request = NSMutableURLRequest(URL:url) request.HTTPMethod = "GET" request.addValue("application/json", forHTTPHeaderField: "Content-Type") return NSURLSession.requestSynchronousJSON(request) } } public extension String { /// Return an URL encoded string func URLEncodedString() -> String? { let customAllowedSet = NSCharacterSet.URLQueryAllowedCharacterSet() return self.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet) } }