swift3.0:NSURLSession的使用
一、说明
NSURLSession是OC中的会话类,在Swift中变成URLSession类,它们的实现方式是一样的,下面的示例就Swift语法进行讲解和介绍。
二、介绍:
URLSession 类支持3种类型的任务:加载数据、下载和上传。
加载数据:Data Task
下载数据:Downlaod Task
上传数据:Upload Task
毫无疑问,Session Task是整个URLSession架构的核心目标。
三、示例
第1种Data Task用于加载数据。
使用全局share和func dataTask(...)->URLSessionDataTask方法创建。
//MARK - URLSessionDataTask
func sessionLoadTsk() { //1、创建URL对象;
let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews?type=beauty"); //2、创建Request对象;
let urlRequest:URLRequest = URLRequest(url:url); //3、创建会话
let session = URLSession.shared //4、通过创建任务
let dataTask = session.dataTask(with: urlRequest) { (data:Data?, response:URLResponse?, error:Error?) in if(error != nil){
print(error?.localizedDescription);
}else{
//let jsonStr = String(data: data!, encoding:String.Encoding.utf8);
//print(jsonStr)
do {
let dic = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments)
print(dic)
} catch let error{
print(error.localizedDescription);
}
}
} as URLSessionDataTask //5、启动任务
dataTask.resume()
}
解析结果:
{
body = (
{
cThumbnail = "http://d.ifengimg.com/w166_h120/p1.ifengimg.com/ifengiclient/ipic/2017040117/swoole_location_1af16fdc4e8301e229769e7892877895_3742809557_size202_w690_h1155.jpg";
cid = 1;
comments = 0;
commentsUrl = "http://share.iclient.ifeng.com/news/sharenews.f?&fromType=spider&aid=301352";
commentsall = 0;
content = "";
ctime = "2017-04-01 18:00:02";
id = "shortNews_301352";
img = (
{
size = {
height = 803;
width = 480;
};
url = "
...........
...........
...........
}
第2种Download Task用于完成下载文件的任务。
如果不需要获取进度,就使用全局的share和func downloadTaskWithRequest(...)->NSURLSessionDownloadTask方法创建。
//MARK - URLSessionDownloadTask
func sessionSimpleDownLoad(){ //1、创建URL下载地址
let url:URL! = URL(string:"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1491221913316&di=f416fd4642c4b63c8b82521031ce8529&imgtype=0&src=http%3A%2F%2Fimg.tupianzj.com%2Fuploads%2Fallimg%2F160309%2F9-16030Z92137.jpg"); //2、创建Request对象
let urlRequest:URLRequest = URLRequest(url:url); //3、创建会话
let session = URLSession.shared //4、通过创建任务
let downLoadTask = session.downloadTask(with: urlRequest) { (location:URL?, response:URLResponse?, error:Error?) in //location位置转换
let locationPath = location?.path //复制到我们自己的目录中
let documentPath:String = "/Users/xiayuanquan/Desktop/demo1.png" //创建文件管理器
let fileManager:FileManager = FileManager.default do{
try fileManager.moveItem(atPath: locationPath!, toPath: documentPath)
}catch let error{
print(error.localizedDescription);
} } as URLSessionDownloadTask //5、启动任务
downLoadTask.resume()
}
下载结果:显示在桌面

如果需要获取进度,就使用自定义的URLSession和func downloadTaskWithRequest(...)->NSURLSessionDownloadTask方法创建。
1、创建会话单例
//创建一个下载模式--单例实例
public extension DispatchQueue {
private static let _onceToken = NSUUID().uuidString
private static var _onceTracker = [String]()
public class func once(block:()->Void) {
objc_sync_enter(self)
defer { objc_sync_exit(self) } if _onceTracker.contains(_onceToken) {
return
}
_onceTracker.append(_onceToken)
block()
}
}
2、执行下载任务
//MARK - URLSessionDownloadTask
func currentSession() -> URLSession {
var currentSession:URLSession?
DispatchQueue.once() {
let config = URLSessionConfiguration.default
currentSession = URLSession(configuration: config, delegate:self, delegateQueue: nil)
}
return currentSession!;
} func sessoinProgressDownload() {
//1、创建URL下载地址
let url:URL! = URL(string:"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1491221913316&di=f416fd4642c4b63c8b82521031ce8529&imgtype=0&src=http%3A%2F%2Fimg.tupianzj.com%2Fuploads%2Fallimg%2F160309%2F9-16030Z92137.jpg"); //2、创建Request对象
let urlRequest:URLRequest = URLRequest(url:url); //3、创建会话
let session = currentSession() //4、下载任务
let downloadTask = session.downloadTask(with: urlRequest) //5、启动任务
downloadTask.resume()
}
}
3、监听代理方法
// MARK - URLSessionDownloadDelegate
extension URLSessionController:URLSessionDownloadDelegate{ //下载进度
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { //获取进度
let written:CGFloat = CGFloat(bytesWritten)
let total:CGFloat = CGFloat(totalBytesWritten)
let pro:CGFloat = written/total
print("----下载进度:------\(pro)");
} //下载偏移
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) { //主要用于暂停续传
} //下载结束
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { //location位置转换
let locationPath = location.path //复制到我们自己的目录中
let documentPath:String = "/Users/xiayuanquan/Desktop/demo1.png" //创建文件管理器
let fileManager:FileManager = FileManager.default do{
try fileManager.moveItem(atPath: locationPath, toPath: documentPath)
}catch let error{
print(error.localizedDescription);
}
}
}
下载结果:
----下载进度:------1.0
----下载进度:------0.804931929103519
----下载进度:------0.198212299707542
----下载进度:------0.0266228298785133
----下载进度:------0.025989494854822

第3种Upload Task用于完成上传文件的任务,与下载方法类似。
//使用URLSessionDataTask上传文件
func sessionUpload() { //1、创建URL上传地址,服务器自己搭建
var url:URL! = URL(string:"http://xxx.com/upload.php"); //2、创建Request对象
let urlRequest:URLRequest = URLRequest(url:url); //3、创建会话
let session = currentSession() //4、上传数据流
let docmentPath:String = "/Users/xiayuanquan/Desktop/demo1.png";
url = URL.init(string: docmentPath)
do{
let imageData = try Data(contentsOf: url, options: Data.ReadingOptions.alwaysMapped) //5、创建上传任务
let uploadTask = session.uploadTask(with: urlRequest, from: imageData, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) in
//上传完毕后判断
print("上传完毕")
}) //6、启动任务
uploadTask.resume() }catch let error{
print(error.localizedDescription);
}
四、完整代码
//
// URLSessionController.swift
// NetWorkTest
//
// Created by 夏远全 on 2017/4/3.
// Copyright © 2017年 夏远全. All rights reserved.
// import UIKit class URLSessionController: UIViewController { override func viewDidLoad() {
super.viewDidLoad()
} //第1种Data Task用于加载数据。
//使用全局share和func dataTask(...)->URLSessionDataTask方法创建。
//MARK - URLSessionDataTask
func sessionLoadTsk() { //1、创建URL对象;
let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews?type=beauty"); //2、创建Request对象;
let urlRequest:URLRequest = URLRequest(url:url); //3、创建会话
let session = URLSession.shared //4、通过创建任务
let dataTask = session.dataTask(with: urlRequest) { (data:Data?, response:URLResponse?, error:Error?) in if(error != nil){
print(error?.localizedDescription);
}else{
//let jsonStr = String(data: data!, encoding:String.Encoding.utf8);
//print(jsonStr)
do {
let dic = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments)
print(dic)
} catch let error{
print(error.localizedDescription);
}
}
} as URLSessionDataTask //5、启动任务
dataTask.resume()
} //第2种Download Task用于完成下载文件的任务。
//不需要获取进度,就使用全局的share和func downloadTask(...)->URLSessionDownloadTask方法创建。
//MARK - URLSessionDownloadTask
func sessionSimpleDownLoad(){ //1、创建URL下载地址
let url:URL! = URL(string:"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1491221913316&di=f416fd4642c4b63c8b82521031ce8529&imgtype=0&src=http%3A%2F%2Fimg.tupianzj.com%2Fuploads%2Fallimg%2F160309%2F9-16030Z92137.jpg"); //2、创建Request对象
let urlRequest:URLRequest = URLRequest(url:url); //3、创建会话
let session = URLSession.shared //4、通过创建任务
let downLoadTask = session.downloadTask(with: urlRequest) { (location:URL?, response:URLResponse?, error:Error?) in //location位置转换
let locationPath = location?.path //复制到我们自己的目录中
let documentPath:String = "/Users/xiayuanquan/Desktop/demo1.png" //创建文件管理器
let fileManager:FileManager = FileManager.default do{
try fileManager.moveItem(atPath: locationPath!, toPath: documentPath)
}catch let error{
print(error.localizedDescription);
} } as URLSessionDownloadTask //5、启动任务
downLoadTask.resume()
} //第2种Download Task用于完成下载文件的任务。
//需要获取进度,就使用自定义的URLSession和func downloadTask(with request: URLRequest) -> URLSessionDownloadTask方法创建。
//MARK - URLSessionDownloadTask
func currentSession() -> URLSession {
var currentSession:URLSession?
DispatchQueue.once() {
let config = URLSessionConfiguration.default
currentSession = URLSession(configuration: config, delegate:self, delegateQueue: nil)
}
return currentSession!;
}
func sessoinProgressDownload() {
//1、创建URL下载地址
let url:URL! = URL(string:"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1491221913316&di=f416fd4642c4b63c8b82521031ce8529&imgtype=0&src=http%3A%2F%2Fimg.tupianzj.com%2Fuploads%2Fallimg%2F160309%2F9-16030Z92137.jpg"); //2、创建Request对象
let urlRequest:URLRequest = URLRequest(url:url); //3、创建会话
let session = currentSession() //4、下载任务
let downloadTask = session.downloadTask(with: urlRequest) //5、启动任务
downloadTask.resume()
} //第3种Upload Task用于完成上传文件的任务,与下载方法类似
//使用URLSessionDataTask上传文件
func sessionUpload() { //1、创建URL上传地址
var url:URL! = URL(string:"http://xxx.com/upload.php"); //2、创建Request对象
let urlRequest:URLRequest = URLRequest(url:url); //3、创建会话
let session = currentSession() //4、上传数据流
let docmentPath:String = "/Users/xiayuanquan/Desktop/demo1.png";
url = URL.init(string: docmentPath)
do{
let imageData = try Data(contentsOf: url, options: Data.ReadingOptions.alwaysMapped) //5、创建上传任务
let uploadTask = session.uploadTask(with: urlRequest, from: imageData, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) in //上传完毕后判断
print("上传完毕")
}) //6、启动任务
uploadTask.resume() }catch let error{
print(error.localizedDescription);
}
} }
//创建一个下载模式--单例实例
public extension DispatchQueue {
private static let _onceToken = NSUUID().uuidString
private static var _onceTracker = [String]()
public class func once(block:()->Void) {
objc_sync_enter(self)
defer { objc_sync_exit(self) } if _onceTracker.contains(_onceToken) {
return
}
_onceTracker.append(_onceToken)
block()
}
} // MARK - URLSessionDownloadDelegate
extension URLSessionController:URLSessionDownloadDelegate{ //下载进度
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { //获取进度
let written:CGFloat = CGFloat(bytesWritten)
let total:CGFloat = CGFloat(totalBytesWritten)
let pro:CGFloat = written/total
print("----下载进度:------\(pro)");
} //下载偏移
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) { //主要用于暂停续传
} //下载结束
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { //location位置转换
let locationPath = location.path //复制到我们自己的目录中
let documentPath:String = "/Users/xiayuanquan/Desktop/demo1.png" //创建文件管理器
let fileManager:FileManager = FileManager.default do{
try fileManager.moveItem(atPath: locationPath, toPath: documentPath)
}catch let error{
print(error.localizedDescription);
}
}
}
swift3.0:NSURLSession的使用的更多相关文章
- Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)
前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- Swift3.0变化分享
Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...
- swift3.0变化总结
Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...
- 关于for循环------swift3.0
在程序开发当中,for循环使用的频率无疑是最高的.常用的swift循环是递增式遍历.当然各种循环,swift都能办到.但其大多采用关键字形式实现,大部分开发者更喜欢直接使用C式循环代码.在swift3 ...
- Swift2.3 --> Swift3.0 的变化
Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Synt ...
- Swift3.0都有哪些变化
从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行.在W ...
- iOS开发 swift3.0中文版
swift3.0中文版: http://pan.baidu.com/s/1nuHqrBb
- swift3.0的改变
Swift在这2年的时间内,发展势头迅猛,在它开源后,更是如井喷一样,除了 iOS.mac 平台,还支持了 Linux. 而今年下半年, Swift 3.0 也会随之发布.https://github ...
随机推荐
- AngularJS初始化静态模板
AngularJS可以通过ng-app来自动初始化模块,也可以通过angular.bootstrap(document, [module])手动启动应用,不管用哪种方法,应用启动后,动态往dom树里面 ...
- [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解
参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- BZOJ4276 : [ONTAK2015]Bajtman i Okrągły Robin
建立线段树, S向每个叶子连边,容量1,费用0. 孩子向父亲连边,容量inf,费用0. 每个强盗向T连边,容量1,费用为c[i]. 对应区间内的点向每个强盗,容量1,费用0. 求最大费用流即可. #i ...
- Cannot create a new pixel buffer adaptor with an asset writer input that has already started writing'
reason: '*** -[AVAssetWriterInputPixelBufferAdaptor initWithAssetWriterInput:sourcePixelBufferAttrib ...
- NXP LPC-Link LPC3154
LPC-Link: LPC-Link调试探针由恩智浦.Code Red和Embedded Artists三方共同开发, 该探针可与目标板断开,利用板载10针JTAG/SWD连接器直接用于客户自己的设计 ...
- 推荐13个.Net开源的网络爬虫
1:.Net开源的跨平台爬虫框架 DotnetSpider Star:430 DotnetSpider这是国人开源的一个跨平台.高性能.轻量级的爬虫软件,采用 C# 开发.目前是.Net开源爬虫最为优 ...
- 如何让PictureBox背景色透明
winform程序中的PictureBox载入了一张带有透明度的PNG图片,悬浮于其他控件之上,但是它的背景不是透明的,即使把它的BackColor设置为Color.Transparent,或者是0x ...
- 调试工具BTrace 的使用--例子
http://www.cnblogs.com/serendipity/archive/2012/05/14/2499840.html
- Flume 1.5.0简单部署试用
================================================================================ 一.Flume简介 ========= ...