mas/mas-cli/NSURLSession+Synchronous.swift

64 lines
2.4 KiB
Swift
Raw Normal View History

//
// 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)
}
}