工程日记之ChildLost(1):URLSession
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的更多相关文章
- 工程日记之ChildLost(2) :如何编写一个多线程的程序
Dispatch Dispatch结合语言特性,运行时,和系统的特点,提供了系统的,全面的高层次API来提升多核多线程编程的能力. Dispatch会自动的根据CPU的使用情况,创建线程来执行任务,并 ...
- 工程日记之HelloSlide(3):如何使用Core Data数据库,以及和sqlite之间的对应关系
Core Data 和 SQLite 是什么关系 core data是对sqlite的封装,因为sqlite是c语言的api,然而有人也需要obj-c的api,所以有了core data ,另外,co ...
- 工程日记之HelloSlide(2) : UITextView中如何根据给定的长宽,计算最合适的字体大小
需求描述 一般的需求是将UITextview的大小自适应文本高度,会做出随文本内容增加,文字框不断增大的效果: 本文反其道而行之,在给定文字框大小的情况下:字数越多,字体越小: 需求来源: 考虑将文字 ...
- 工程日记之HelloSlide(1):Swift自定义可视化组件的方法(继承UIView和在StoryBoard中设置)
需求描述 HelloSlide是把文本自动转化成幻灯片的软件,在幻灯片中我们有SmartArt:各种各样的几何形状,并且可以自定义大小和颜色,放在幻灯片不同的位置. 为了在我们的软件中实现类似的效果, ...
- scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据
在安装完scrapy以后,相信大家都会跃跃欲试想定制一个自己的爬虫吧?我也不例外,下面详细记录一下定制一个scrapy工程都需要哪些步骤.如果你还没有安装好scrapy,又或者为scrapy的安装感到 ...
- 团队项目-BUG排查-ADT工程 To Android Studio 一整天的排查日记
4-22 10:44至4-23 0:45 ①打开Eclipse从Github上Clone MathsApp到本机,报错'Unable to resolve target'android-19' ②尝试 ...
- spring mvc 引入log4日记记录maven工程 slf4j和log4j输出到控制台配合使用log4j不输出到文件
https://blog.csdn.net/qq_27093465/article/details/62928590 使用slf4j的优点: 提供带参数的日志输出方法(SLF4J 1.7及以后版本). ...
- scrapy爬虫成长日记之将抓取内容写入mysql数据库
前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取的数据时保存为json格式的文本文件中的.这很显然不满足我 ...
- Unsupported major.minor version 51.0 在配置/运行Maven工程时,JDK与Maven所引用的jdk版本不一致
在配置Maven工程,部署到tomcat服务器运行的过程中,遇到如下错误: "Unsupported major.minor version 51.0 " 错误原因是由于maven ...
随机推荐
- SpringBoot#应用启动后执行某些逻辑
// 方式1 @Component public class WhenStartupA implements InitializingBean { @Override public void afte ...
- java#内部类和嵌套类
内容思路来自Java编程思想,个人读书做的笔记,仅个人复习之用,故他人参考请自行辨别内容是否有错误. 在类的类部可以定义类,叫做内部类.如果这个内部类被static修饰,此时内部的类叫做嵌套类. 内部 ...
- java api 远程连接 hdfs
IDEA中新建Maven工程,添加POM依赖, 在IDE的提示中, 点击 Import Changes 等待自动下载完成相关的依赖包. <?xml version="1.0" ...
- Day4 - G - 确定比赛名次 HDU - 1285
有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道 ...
- JAVA Random 详解
Java中存在着两种Random函数: 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范 ...
- Jupyter Notebooks usage
Important note: You should always work on a duplicate of the course notebook. On the page you used t ...
- maven的本地仓库
今天新建的一个maven项目的依赖出了问题,想删除本地仓库的相关依赖文件夹,再重新加载,结果半天没找到文件夹位置. 我因为是改了maven的setting文件的,所以是直接到设置的文件夹里面找,结果半 ...
- tornado peewee_async
https://peewee-async.readthedocs.io/en/latest/peewee_async/examples.html https://www.cnblogs.com/Vic ...
- QObject的timerEvent使用
其实在QT里,我们自己写的类一般通常需要继承QObject类,因为这一类里规定好的拿来即可用的方法. 比如信号,槽,以及前一个博文写的movetothread方法,这里就是介绍一个QObject的ti ...
- C++ 非白名单程序间接启动
主要的思路是不能用不受信任的程序直接参与创建进程,而是间接启动目标进程.比如你可以把目标程序创建快捷方式,然后设置快捷键.然后向桌面发快捷键的按键消息,目标程序就会被桌面程序启动.