Skip to content

Latest commit

 

History

History
159 lines (119 loc) · 6.06 KB

20.网络请求.md

File metadata and controls

159 lines (119 loc) · 6.06 KB

20.网络请求

在iOS开发框架中,提供了两个平行的网络请求框架,分别是NSURLConnection框架与URLSession框架。在iOS 7系统之前,只支持使用NSURLConnection进行网络请求,iOS 7之后系统才引入了URLSession框架,相比之下,URLSession更加灵活强大,并且还加入了后台请求的相关能力。

Get请求

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()

Post请求

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的子类

使用UserDefaults进行简单数据的持久化存储

在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文件进行数据持久化处理

对于Plist文件,可能并不陌生,在开发中,开发者经常会对工程的配置文件Info.Plist进行配置修改。这也是Plist文件最合适的应用场景之一:储存系统配置信息。Plist文件的内容实质是使用XML格式编写的,支持的数据类型包括Array、Dictionary、Boolean、Data、Number和String。如果直接使用文本编辑器打开Plist文件,读者会发现其使用标签进行数据定义,直观性和操作性都不强,Xcode开发工具自带Plist文件编辑器,使用它观看和编辑Plist文件都十分方便。