在iOS开发框架中,提供了两个平行的网络请求框架,分别是NSURLConnection框架与URLSession框架。在iOS 7系统之前,只支持使用NSURLConnection进行网络请求,iOS 7之后系统才引入了URLSession框架,相比之下,URLSession更加灵活强大,并且还加入了后台请求的相关能力。
let url = URL(string: "http://www.baidu.com")
// 创建一个请求对话
let session = URLSession.shared
// 获取请求task
let task = session.dataTask(with: url!) { (data, response, error) in
if error != nil {
print("error")
}
if data != nil {
print(response?.url)
}
}
// 执行task请求
task.resume()
let url = URL(string: "http://www.baidu.com")
// 创建可变的请求对象
let request = NSMutableURLRequest(url: url!)
request.httpMethod = "POST"
request.httpBody = "username=aaa&psw=111".data(using: .utf8)
// 创建一个请求对话
let session = URLSession.shared
// 获取请求task
let task = session.dataTask(with: url!) { (data, response, error) in
if error != nil {
print("error")
}
if data != nil {
print(response?.url)
}
}
// 执行task请求
task.resume()
import UIKit
class ViewController: UIViewController, URLSessionTaskDelegate {
var mView: MyView!
override func viewDidLoad() {
super.viewDidLoad()
let btn = UIButton(frame: CGRect(x: 150, y: 100, width: 100, height: 50))
btn.backgroundColor = UIColor.green
btn.setTitle("animate", for: .normal)
self.view.addSubview(btn)
btn.addTarget(self, action: #selector(animate(_:)), for: .touchUpInside)
}
@objc func animate(_ sender: UIButton) {
let url = URL(string: "http://www.baidu.com")
var request = URLRequest(url: url!)
// 这里需要这样书写,否则,在 URLSessionDownloadDelegate 的代理中** totalBytesExpectedToWrite** 会一直返回 -1。
request.addValue("", forHTTPHeaderField: "Accept-Encoding")
// 创建一个请求对话
let session = URLSession(configuration: .default, delegate: self, delegateQueue: .main)
// 获取请求task
let task = session.downloadTask(with: request) { (data, response, error) in
if error != nil {
print("error")
}
if data != nil {
print(response?.url)
}
}
// 执行task请求
task.resume()
}
// 当请求完成会调用该方法
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
}
}
上面在创建URLSession的时候configuration有三种:
- .default:默认会话模式,使用的是全局的基于磁盘缓存的持久化策略
- .ephemeral:暂时会话模式,该模式不使用磁盘保存任何数据,所以会话的cookie、cache、证书等都会被放到ram中,当程序会话无效,这些缓存的数据就会被自动情况。
- .background:该模式在后台完成上传和下载,在创建configuration的时候需要提供一个id标识完成工作的后台会话。
Task分类:
- URLSessionTask:一个可撤销的对象,在声明周期内完成一个给定的请求
- URLSessionDataTask:URLSessionTask的子类,用于数据的请求
- URLSessionUploadTask:是一个上传的URLSessionDataTask的子类
- URLSessionDownloadTask:是一个下载数据的URLSessionTask的子类
- URLSessionStreamTask:是一个双向会话的URLSessionTask的子类
在iOS开发中,对于这类有配置意义或者是结构简单的、数据量小的数据,一般通过UserDefaults类来完成持续化存储。UserDefaults采用键值对的模式,可以方便地对常见数据类型进行持久化存储操作,其实质是将数据写成Plist文件存在本地。
对于每一个应用程序,系统都会默认为其创建一个UserDefaults实例,通过UserDefaults类的standard属性可以拿到这个实例对象,通过它可以对常见类型的数据进行持久化存储。数据的存储操作与写入磁盘之间有一定的延时,调用synchronize()方法可以将存储的数据立即同步到磁盘。
import UIKit
class ViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
let userDefaults = UserDefaults.standard
// 进行url存储
userDefaults.set(URL(string: "https://www.baidu.com"), forKey: "urlKey")
// 进行字符串数据存储
userDefaults.set("stringvalue", forKey: "stringKey")
userDefaults.set(true, forKey: "boolKey")
userDefaults.set(Double(0.1), forKey: "doubleKey")
// 将操作数据同步
userDefaults.synchronize()
print(userDefaults.url(forKey: "urlKey"))
print(userDefaults.double(forKey: "doubleKey"))
// 清空
userDefaults.removeObject(forKey: "urlKey")
}
}
对于Plist文件,可能并不陌生,在开发中,开发者经常会对工程的配置文件Info.Plist进行配置修改。这也是Plist文件最合适的应用场景之一:储存系统配置信息。Plist文件的内容实质是使用XML格式编写的,支持的数据类型包括Array、Dictionary、Boolean、Data、Number和String。如果直接使用文本编辑器打开Plist文件,读者会发现其使用标签进行数据定义,直观性和操作性都不强,Xcode开发工具自带Plist文件编辑器,使用它观看和编辑Plist文件都十分方便。
- 邮箱 :charon.chui@gmail.com
- Good Luck!