URLSession 是什么

URL Loading System提供了访问URL资源的系统,提供了访问http/https/自定义URL访问的接口。其中,URLSession实例可以创建多个URLSessionTask实例,完成不同的工作。

我们可以将URLSession类理解为会话层,用于管理网络接口的创建、维护、删除等等工作,我们要做的工作也只是会话层之后的层。

  • URLSessionDataTask : 一个 数据请求 的 URLSessionTask 的子类,用于数据的请求。
  • URLSessionUploadTask : 是一个 上传数据 的 URLSessionDataTask 的子类。
  • URLSessionDownloadTask : 是一个下载数据 的 URLSessionTask 的子类。
  • URLSessionStreamTask : 是一个双向会话的 URLSessionTask 的子类。

基础使用

这里上传下载的都是一个字符串;实际形式是json(需要把NSData转成Json)

get

                        let url1 = "https://coconutnut.xyz:2019/tumble"
let sessionConfigure = URLSessionConfiguration.default
// sessionConfigure.httpAdditionalHeaders = ["Content-Type": "application/json"]
// sessionConfigure.timeoutIntervalForRequest = 30
sessionConfigure.requestCachePolicy = .reloadIgnoringLocalCacheData
let session = URLSession(configuration: sessionConfigure) guard let url = URL(string: url1) else {
return
}
let url1Request = URLRequest(url: url)
let dataTask1 = session.dataTask(with: url1Request) { (data, response, error) in
guard data != nil else {return}
let str = String(data: data!, encoding: String.Encoding.utf8)
// 这里需要再加一个逻辑判断
guard let strnow = str else{return}

最后返回的strnow就是我们要获得的字符串;

post

let order = Qumot(value: "")
guard let uploadData = try? JSONEncoder().encode(order) else {
return
}
print(uploadData) let url = URL(string: "https://coconutnut.xyz:2019/qumot")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let task = URLSession.shared.uploadTask(with: request, from: uploadData) { data, response, error in
if let error = error {
print ("error: \(error)")
return
}
guard let response = response as? HTTPURLResponse,
(...).contains(response.statusCode) else {
print ("server error")
return
}
if let mimeType = response.mimeType,
mimeType == "application/json",
let data = data,
let dataString = String(data: data, encoding: .utf8) {
print ("got data: \(dataString)")
}
}
task.resume()

使用Delegate

后台唤醒的地方,可以使用自己写的回调函数

可以在这些地方用到闭包

Tasks in a session also share a common delegate object. You implement this delegate to provide and obtain information when various events occur, including when:

  • Authentication fails.

  • Data arrives from the server.

  • Data becomes available for caching.

If you don’t need the features provided by a delegate, you can use this API without providing one by passing nil when you create a session.

另外这是一个异步的接口,你可以一边处理UI一边访问网络

Like most networking APIs, the URLSession API is highly asynchronous. It returns data to your app in one of two ways, depending on the methods you call:

  • By calling a completion handler block when a transfer finishes successfully or with an error.

  • By calling methods on the session’s delegate as data arrives and when the transfer is complete.

URLSession的状态

1. default

2. emphemaral : 为了保证用户隐私,不将cookie或者本地cache或者证书持久化

3. background : 把下载的任务交给System,则即使app已经被terminated此时依然可以被下载,但是当app relaunch的时候要根据identifier重拾这个下载任务并且去retrieve data

https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1407496-background

https://developer.apple.com/documentation/foundation/url_loading_system

https://developer.apple.com/documentation/foundation/url_loading_system/uploading_data_to_a_website

工程日记之ChildLost(1):URLSession的更多相关文章

  1. 工程日记之ChildLost(2) :如何编写一个多线程的程序

    Dispatch Dispatch结合语言特性,运行时,和系统的特点,提供了系统的,全面的高层次API来提升多核多线程编程的能力. Dispatch会自动的根据CPU的使用情况,创建线程来执行任务,并 ...

  2. 工程日记之HelloSlide(3):如何使用Core Data数据库,以及和sqlite之间的对应关系

    Core Data 和 SQLite 是什么关系 core data是对sqlite的封装,因为sqlite是c语言的api,然而有人也需要obj-c的api,所以有了core data ,另外,co ...

  3. 工程日记之HelloSlide(2) : UITextView中如何根据给定的长宽,计算最合适的字体大小

    需求描述 一般的需求是将UITextview的大小自适应文本高度,会做出随文本内容增加,文字框不断增大的效果: 本文反其道而行之,在给定文字框大小的情况下:字数越多,字体越小: 需求来源: 考虑将文字 ...

  4. 工程日记之HelloSlide(1):Swift自定义可视化组件的方法(继承UIView和在StoryBoard中设置)

    需求描述 HelloSlide是把文本自动转化成幻灯片的软件,在幻灯片中我们有SmartArt:各种各样的几何形状,并且可以自定义大小和颜色,放在幻灯片不同的位置. 为了在我们的软件中实现类似的效果, ...

  5. scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据

    在安装完scrapy以后,相信大家都会跃跃欲试想定制一个自己的爬虫吧?我也不例外,下面详细记录一下定制一个scrapy工程都需要哪些步骤.如果你还没有安装好scrapy,又或者为scrapy的安装感到 ...

  6. 团队项目-BUG排查-ADT工程 To Android Studio 一整天的排查日记

    4-22 10:44至4-23 0:45 ①打开Eclipse从Github上Clone MathsApp到本机,报错'Unable to resolve target'android-19' ②尝试 ...

  7. spring mvc 引入log4日记记录maven工程 slf4j和log4j输出到控制台配合使用log4j不输出到文件

    https://blog.csdn.net/qq_27093465/article/details/62928590 使用slf4j的优点: 提供带参数的日志输出方法(SLF4J 1.7及以后版本). ...

  8. scrapy爬虫成长日记之将抓取内容写入mysql数据库

    前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取的数据时保存为json格式的文本文件中的.这很显然不满足我 ...

  9. Unsupported major.minor version 51.0 在配置/运行Maven工程时,JDK与Maven所引用的jdk版本不一致

    在配置Maven工程,部署到tomcat服务器运行的过程中,遇到如下错误: "Unsupported major.minor version 51.0 " 错误原因是由于maven ...

随机推荐

  1. 微信小程序循环中点击一个元素,其他的元素不发生变化,类似点击一个循环中的语音,其他的不发生点击事件

    类似语音,因为都在一个数据内,所以点击第一个,所有的语音都变化,解决方法就是 把整个数据都获取下来,然后更改其中一个需要更改的值,然后再把整个数据都setdata回去,如果需要动画的话,wxml里面放 ...

  2. jenkins#自动构建并部署springboot的jar包

    1.GitLab 8.0.0(版本比较低,配置比较简单) 配置 点击项目 --> settings --> web Hooks 2.jenkins配置

  3. 访问eureka 显示xml

    两种解决方式: 方式一:(我是通过此方式解决的) 一个博客“http://blog.csdn.net/l5764773160/article/details/77483730”,他的解决方案是: 将项 ...

  4. 获取url特定字后面的参数

    var type = getUrlParam('type') ?getUrlParam('type' ):'' ; //获取url中的参数 function getUrlParam( name) { ...

  5. 读取docx表格中的信息

    参考了 http://blog.csdn.net/qq_34475777/article/details/62055523 http://www.cnblogs.com/deepwaterplan/a ...

  6. 099-PHP二维数组的元素输出二

    <?php $stu=array(array(76,87,68), array(65,89,95), array(90,80,66), array(90,95,65)); //定义一个二维数组 ...

  7. 【LGR-(-8)】洛谷入门赛 #5 题解

    比赛链接 9道题. 注:题目名称中链接为题目链接,题号中链接为比赛内链接 题目编号 洛谷题号 题目名称 题目难度 A P5713 [深基3.例5]洛谷团队系统 \(\color{red}{入门}\) ...

  8. 第一部分 JavaScript语言核心(一)

    第二章 词法结构 P25 JavaScript是区分大小写的语言:但HTML不区分大小写(XHTML区分大小写,但浏览器具有强大的纠错能力.) 第三章 类型.变量和值 P32 var(variable ...

  9. SpringBoot Application事件监听

    SpringBoot Application共支持6种事件监听,按顺序分别是: ApplicationStartingEvent:在Spring最开始启动的时候触发 ApplicationEnviro ...

  10. 创建Oracle序列sequence

    create sequence SEQ_ID minvalue 1 maxvalue 99999999 start with 1 increment by 1 nocache order; 建解发器代 ...