Swift - 网络 URLSession

2019-08-16  本文已影响0人  H_Zimi

问:Swift的网络请求怎么实现?
答:用AFNetworkingAlamofire这些框架啊,快速、好用、数据解析难度低。
是的,第三方网络框架真的好用,好用到我们都快忘了原生API是怎么玩了,但万丈高楼平地起,原生API我们还是有必要掌握的,能让我们更容易、更深入理解AFNetworkingAlamofire等框架,写这篇文章的目的是对Swift的原生API URLSession的复习

基本网络请求:

// Swift简单网络请求
let urlString = "http://rap2api.taobao.org/app/mock/228467/api/friend/list"
URLSession.shared.dataTask(with: URL(string: urlString)!) { (data, response, error) in
    if error != nil {
        print("\(String(describing: error))")
    }
    print("\(String(describing: response))")
}.resume()

//OC 网络请求
NSString *urlString = [NSString stringWithFormat:@"http://rap2api.taobao.org/app/mock/228467/api/friend/list"];
[[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:urlString] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (!error) {
        NSLog(@"%@",error);
    }
    NSLog(@"%@", response);
}] resume];

网络请求配置 - Configuration

一、模式
open class var `default`: URLSessionConfiguration { get }

open class var ephemeral: URLSessionConfiguration { get }

@available(iOS 8.0, *)
open class func background(withIdentifier identifier: String) -> URLSessionConfiguration

后台执行任务的时候注意点

//Listing 1 Creating a background URL session
private lazy var urlSession: URLSession = {
    let config = URLSessionConfiguration.background(withIdentifier: "MySession")
    config.isDiscretionary = true
    config.sessionSendsLaunchEvents = true
    return URLSession(configuration: config, delegate: self, delegateQueue: nil)
}()

//Listing 2 Creating a download task from a URL session
let backgroundTask = urlSession.downloadTask(with: url)
backgroundTask.earliestBeginDate = Date().addingTimeInterval(60 * 60)
backgroundTask.countOfBytesClientExpectsToSend = 200
backgroundTask.countOfBytesClientExpectsToReceive = 500 * 1024
backgroundTask.resume()

//Listing 3 Storing the background download completion handler sent to the application delegate
var backgroundCompletionHandler: (() -> Void)?
func application(_ application: UIApplication,
                 handleEventsForBackgroundURLSession identifier: String,
                 completionHandler: @escaping () -> Void) {
    backgroundCompletionHandler = completionHandler
}

//Listing 4 Executing the background URL session completion handler on the main queue
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
    DispatchQueue.main.async {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate,
            let backgroundCompletionHandler =
            appDelegate.backgroundCompletionHandler else {
                return
        }
        backgroundCompletionHandler()
    }
}

PS: 官方文档查看方法:

二、请求缓存策略
public enum CachePolicy : UInt {
   //默认策略
   case useProtocolCachePolicy 
   //指定应从原始源加载URL加载的数据, 没有本地缓存数据
   case reloadIgnoringLocalCacheData 
   //指定不仅应忽略本地缓存数据,而且应指示代理和其他中间人在协议允许的情况下忽略其缓存。未实现
   case reloadIgnoringLocalAndRemoteCacheData
   //与reloadIgnoringLocalCacheData相同
   public static var reloadIgnoringCacheData: NSURLRequest.CachePolicy { get }
    //指定应使用现有缓存数据来满足URL加载请求,不管其生命周期或到期日期。 但是,如果缓存中没有与URL加载请求相对应的现有数据,则从原始源加载URL
   case returnCacheDataElseLoad
   //指定应使用现有缓存数据来满足URL加载请求,不管其生命周期或到期日期。 但是,如果缓存中没有与URL加载请求相对应的现有数据,则不会尝试从源源加载URL,并且认为加载失败。 此常量指定类似于“脱机”模式的行为。
   case returnCacheDataDontLoad
   //指定可以使用现有缓存数据,前提是源源确认其有效性,否则从原始源加载URL。未实现。
   case reloadRevalidatingCacheData
}
三、常用的属性
四、安全策略
五、HTTP策略、代理属性
六、Cookie设置

这里只是介绍了SwiftURLSession中一些基本的属性的用途,关于URLSessionDataTask做另一篇章来讲。

PS:鄙人小小码农一枚,限于能力,官方文档或许理解有误,文章中有错误、不足之处,欢迎各位大神指正。

上一篇下一篇

猜你喜欢

热点阅读