工程日记之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 ...
随机推荐
- 利用Python实现自动扫雷
自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1python的第三方库:win ...
- 002.Delphi插件之QPlugins,菜单插件
运行之后的效果如下, 图一 图二 主界面代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUt ...
- 0105 springMVC开发基础
背景 已经明确了MVC的思想和SpringMVC的基本流程,下面就都具体的mvc开发细节知识了. @RequestMapping springMVC核心流程中,启动阶段会把注解@RequeestMap ...
- php中常用的加密函数
1.MD5加密: string md5 ( string $str [, bool $raw_output = false ] ) (1)md5()默认情况下以 32 字符十六进制数字形式返回散列值, ...
- delphi关闭和禁用Windows服务
function StopServices(const SvrName: string): Boolean; var SCH, SvcSCH: SC_HANDLE; SS: TServiceStatu ...
- linux 查看运行进程详细信息
Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息 通过ll或ls –l命令即可查看. ll /proc/PID cwd符号链接的是进程运行 ...
- Hash!
Panda一个字符串是否是另一个字符串的子串 #include<bits/stdc++.h> using namespace std; const int mod=998244353,tt ...
- Python 爬虫是什么
作为程序员,相信大家对“爬虫”这个词并不陌生,身边常常会有人提这个词,在不了解它的人眼中,会觉得这个技术很高端很神秘.不用着急,我们的爬虫系列就是带你去揭开它的神秘面纱,探寻它真实的面目. ! 爬虫是 ...
- JS高级学习笔记(1)- 数据类型及转换规则
必读: Javascript对象Oject的强制类型转换 JavaScript筑基篇(二)->JavaScript数据类型 聊一聊valueOf和toString 深入理解JavaScript系 ...
- servlet 之 HttpServlet抽象类详解
Servlet的框架是由两个Java包组成:javax.servlet和javax.servlet.http. 在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的的通用接口 ...