屏幕快照 2017-01-12 下午10.21.39.png
@H_
403_5@
@H_
403_5@
2、dataTask.resume()是异步执行的,即不阻塞UI。 这里还有闭包的一个概念叫逃逸闭包,对应关键字@escapting, 它的意思是将闭包做为回调异步执行(作用类似于Android的Runnable),调用时立刻返回。
open func dataTask(with request: URLRequest,completionHandler: @escaping (Data?,URLResponse?,Error?) -> Swift.Void) -> URLSessionDataTask
执行日志:
创建任务, 时间:1484230880.29283
开始任务, 时间:1484230880.30001
结束任务, 时间:1484230880.30009
http返回, 时间:1484230881.42724
3、 http交互成功后要判断返回值, 作为初学者我翻遍了URLResponse的方法, 就是没有status code。。。 后来无意中发现了HTTPResponse类, 试着强转并输出它的成员变量, 果然好用。
code 200
Server - Apache
Content-Type - application/json
Transfer-Encoding - Identity
Date - Thu,12 Jan 2017 14:21:21 GMT
Proxy-Connection - Keep-alive
Tracecode - 12812437700874983946011222
4、http执行成功后就是要解析包体并做业务逻辑了, responseStr就是我们最终需要的json字符串, 我们需要反序列化并做逻辑。
if response.statusCode == 200 {
//JSON解析, 做逻辑
} else {
//通知UI接口执行失败
}
二、 下载文件, 使用URLSession的API,代码很简单。 重点是存储位置, iOS会自动生成一个临时文件。 我们要做的是拷贝这个文件到我们想要的目录下。
let url = URL(string: "http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1307/23/c0/23656308_1374564438338_800x600.jpg")
let request = URLRequest(url: url!)
let downloadTask = session.downloadTask(with: request)
downloadTask.resume() //开始下载任务
func urlSession( session: URLSession,downloadTask: URLSessionDownloadTask,didFinishDownloadingTo location: URL) {
print("下载结束, 存储在(location.path)")
}
func urlSession( session: URLSession,didWriteData bytesWritten: Int64,totalBytesWritten: Int64,totalBytesExpectedToWrite: Int64) {
print("total: (totalBytesWritten),current: (bytesWritten)") //下载进度
}
日志:
total: 46276,current: 46276
下载结束, 存储在/Users/brycegao/Library/Developer/CoreSimulator/Devices/8BE9C62E-042E-4B50-8F5D-78F857533650/data/Containers/Data/Application/3A6EB44A-2F88-4E79-9CFC-87713B9FC2E0/tmp/CFNetworkDownload_tnAj6u.tmp
三、上传文件, 因为没有测试服务器,无法调试。 代码跟上传文件类似。
let uploadTask = session.uploadTask(with: request,from: data) {
(data:Data?,response:URLResponse?,error:Error?) -> Void in
//上传完毕
if error != nil{
print(error)
}else{
let str = String(data: data!,encoding: String.Encoding.utf8)
print("上传完毕:(str)") //str是包体
}
}
小结: iOS对HTTP/HTTPS交互封装个一套完整方便的API,主要涉及URLSession、URLSesionTask、URLCache及其派生类; 支持文件、上传/下载文件。
@H_
403_5@
原文链接:https://www.f2er.com/swift/321182.html