在编写一个app的时候,大部分时间都会调用api,然后根据这些api里的数据,我们在做出另外一些其他操作。最常用到的有苹果自带的URLSession,还有Alamofire也是非常好用来调用api。在URLSession里,有三种不同的配置,第一种的default,就是直接调用api,不在做什么其他操作,第二种是ephemeral,这种配置在我们调用api的时候,不会保存任何cache data,或者任何本地数据,是比较保护用户信息的一种配置,还有一种是background,当app在后台的时候,也会进行加载或者传输数据。
首先是default
default里也有两种调用方式,一种是直接用URLsession.share.dataTask是比较基础也是常用的用法。下面是代码
//URLSession.share.datatask
let urlString = "https://api.tvmaze.com/shows/216?embed=seasons&embed=episodes"
struct object: Decodable {
let id: Int
let summary: String
let _embedded: embeddedContainer
}
struct embeddedContainer: Decodable {
let episodes: [episodesContainer]
}
struct episodesContainer: Decodable {
let name: String
let season: Int
let number: Int
}
let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!) { (data, _, _) in
guard let data = data else { return }
let json = try? JSONDecoder().decode(object.self, from: data)
print(json?._embedded.episodes)
// Optional([__lldb_expr_10.episodesContainer(name: "Pilot", season: 1, number: 1), .......
}.resume()
这里我用了一个电视剧的api做测试,并根据这个api里的json数据写了一个struct,这样当我们调用了这个api之后,就可以用JSONDecoder把它分析出来,然后打印里面的数据。
第二种方法是用URLsessionDelegate
//use URLsessionDelegate method, when download partial data
class Downloader: NSObject, URLSessionDataDelegate {
var downloadData = NSMutableData()
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
// getting partial data
downloadData.append(data)
}
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
if let error = error {
print(error)
} else {
print(task.response!)
print(downloadData.length)
print(downloadData)
}
}
}
let downloader = Downloader()
let session = URLSession(configuration: URLSessionConfiguration.default, delegate: downloader, delegateQueue: nil)
let task = session.dataTask(with: url!)
task.resume()
URLSessiondelegate的方式更适合我们去调用部分数据,在授权Downloader这个class URLSessionDelegates后,我们就可以使用URLSessionDelegates里的protocols,然后我们在最后调用URLsession,并在configuration里配置这个class,就可以调用里面的数据。
第二种配置是把为了保护用户隐私,可以把它想象成我们在开一个网页的时候选择成private的设定,这样不会留下任何用户数据
let urlSession = URLSessionConfiguration.ephemeral
我们直接在Configuration的后面加emphemral关键字就可以了
最后一种是background
//use URLsession to download or transfer data in background
let url2 = URL(string: "http://static.tvmaze.com/uploads/images/medium_portrait/1/3603.jpg")
let backgroundDownloader = Downloader()
let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: "backgroudnID")
let backgroundSession = URLSession(configuration: backgroundSessionConfiguration, delegate: backgroundDownloader, delegateQueue: nil)
let backgroundTask = backgroundSession.downloadTask(with: url2!)
backgroundTask.resume()
需要注意的时候当我们需要在后台加载数据的时候,需要在加一个Identifier,当app在后台的时候,我们就可以用这个Identifier继续让数据在后台加载。
本文介绍了在iOS开发中,使用Swift的URLSession进行API调用时,default、ephemeral和background三种配置的用法和特点。default配置包括基础的dataTask使用和URLSessionDelegate的实现;ephemeral配置注重用户隐私,不保存任何缓存数据;background配置则允许在应用后台继续加载和传输数据,需要设置Identifier。
1099

被折叠的 条评论
为什么被折叠?



