1. 前言
在iOS9.0之后,以前使用的NSURLConnection过期,苹果推荐使用NSURLSession来替换NSURLConnection完成网路请求相关操作。
NSURLSession的使用非常简单,先根据会话对象创建一个请求Task,然后执行该Task即可。
NSURLSessionTask本身是一个抽象类,在使用的时候,通常是根据具体的需求使用它的几个子类。关系如下:
2. GET请求
func getWithPath(path: String, paras: Dictionary<String, Any>?, success: @escaping ((_ result: Any) -> ()), failure: @escaping ((_ error: Error) -> ())) {
var i = 0
var address: String = path
// 0. Behind the URL stitching parameters
if let paras = paras {
for (key, value) in paras {
if i == 0 {
address += "?\(key)=\(value)"
} else {
address += "&\(key)=\(value)"
}
i += 1
}
} // end-if
// 1. url
let url = URL(string: path.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
// 2. Establish a connection
// 2.1 创建会话对象
let session = URLSession.shared
// 2.2 根据会话对象创建一个Task(发送请求)
let dataTask = session.dataTask(with: url!) { (data, urlResponse, error) in
if let data = data {
// 4.解析数据
// mutableContainers: 容器是可变的,转成的结果是可变的类型
// mutableLeaves: 叶子节点是可变的
// allowFragments: 允许根节点可以不是Array, Dictionary
if let result = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) {
success(result)
}
} else {
failure(error!)
}
}
// 3. 执行任务
dataTask.resume()
}
2. POST请求
func postWithPath(path: String, paras: Dictionary<String, Any>?, success: @escaping ((_ result: Any) -> ()), faliure:@escaping ((_ error: Error) -> ())) {
var i = 0
var address: String = ""
// 0. stitching parameters
if let paras = paras {
for (key, value) in paras {
if i == 0 {
address += "\(key)=\(value)"
} else {
address += "&\(key)=\(value)"
}
i += 1
}
} // end-if
// 1. url
let url = URL(string: path.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
// 2. Establish a request
// 2.1 创建请求
var urlRequest = URLRequest.init(url: url!, cachePolicy: URLRequest.CachePolicy(rawValue: 0)!, timeoutInterval: 30)
// 2.2 修改请求方法为POST
urlRequest.httpMethod = "POST"
// 2.3 设置请求体
urlRequest.httpBody = address.data(using: .utf8)
// 3. Establish a connection
// 3.1 创建会话对象
let session = URLSession.shared
// 3.2 根据会话对象创建一个Task(发送请求)
let dataTask = session.dataTask(with: urlRequest) { (data, urlResponse, error) in
if let data = data {
// 5.解析数据
if let result = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) {
success(result)
}
} else {
faliure(error!)
}
}
// 4. 执行任务
dataTask.resume()
}