用URLSession里configuration(配置)的用法和区别

本文介绍了在iOS开发中,使用Swift的URLSession进行API调用时,default、ephemeral和background三种配置的用法和特点。default配置包括基础的dataTask使用和URLSessionDelegate的实现;ephemeral配置注重用户隐私,不保存任何缓存数据;background配置则允许在应用后台继续加载和传输数据,需要设置Identifier。

在编写一个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继续让数据在后台加载。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值