NSURLSession簡(jiǎn)單介紹:
NSURLSession在iOS7.0時(shí)被Apple提出后,它包括幾個(gè)部分URLSessionConfiguration乏苦、URLSessionDelegate、URLSessionTask(組)、URLRequest涯曲、URLCache、
URLSessionConfiguration指定NSURLSession的配置信息斯入。這些配置信息決定了NSURLSession的種類(lèi)晰搀,HTTP的額外headers,請(qǐng)求的timeout時(shí)間眯牧,Cookie的接受策略等配置信息
NSURLSession對(duì)比NSURLConnect優(yōu)勢(shì)(簡(jiǎn)單介紹,不細(xì)致)
1.NSURLConnect每次進(jìn)行HTTP請(qǐng)求的時(shí)候 ,都需要三次握手,四次揮手等操作,無(wú)法復(fù)用通道,
NSURLSession在HTTP1.1之后(Keep-Alive),可以復(fù)用鏈接通道,可以三次握手建立鏈接之后繼續(xù)復(fù)用此通道
- NSURLSession針對(duì)下載/上傳等復(fù)雜的網(wǎng)絡(luò)操作提供了專(zhuān)門(mén)的解決方案蹋岩,針對(duì)普通、上傳和下載分別對(duì)應(yīng)三種不同的網(wǎng)絡(luò)請(qǐng)求任務(wù):NSURLSessionDataTask, NSURLSessionUploadTask和NSURLSessionDownloadTask.
3.下載任務(wù)不需要內(nèi)存拼接data,NSURLSession創(chuàng)建本地臨時(shí)文件,寫(xiě)到臨時(shí)文件,優(yōu)化內(nèi)存
4.其他不詳細(xì)介紹,不是本文重點(diǎn)
URLSessionConfiguration介紹
學(xué)習(xí)NSURLSession的過(guò)程中,NSURLSession的配置分為三種類(lèi)型,分別為
工作模式分為下面三種:
//普通模式(default):可以使用緩存 (摘抄介紹https://www.cnblogs.com/zanglitao/p/4082334.html)
+ (NSURLSessionConfiguration *)defaultSessionConfiguration;
//瞬時(shí)模式(ephemeral):不使用緩存
+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration;
//后臺(tái)模式(background):當(dāng)按下home鍵后仍然可以在后臺(tái)進(jìn)行上傳下載操作炸站,需要通過(guò)唯一的identity標(biāo)示
+ (NSURLSessionConfiguration *)backgroundSessionConfiguration:(NSString *)identifier;
本文尤其介紹一下URLSessionConfiguration屬性中的HTTPMaximumConnectionsPerHost,下圖為官方文檔對(duì)此屬性的介紹:
默認(rèn)配置下星澳,iOS對(duì)于同一個(gè)IP服務(wù)器的并發(fā)最大為4,OS X為6旱易。而如果你沒(méi)有使用共享的Session禁偎,則可能會(huì)超過(guò)這個(gè)數(shù)。
代碼舉例:
然后經(jīng)過(guò)測(cè)試和實(shí)踐證明:
NSURLSessionConfiguration==defaultSessionConfiguration
如果用戶(hù)沒(méi)有設(shè)置HTTPMaximumConnectionsPerHost的值,那么iOS系統(tǒng)的最大并發(fā)數(shù) 最大值如文檔所說(shuō),的確是4(OSX 未驗(yàn)證),如果用戶(hù)設(shè)置了最大并發(fā)數(shù),則按照用戶(hù)設(shè)置的最大并發(fā)數(shù)執(zhí)行(我設(shè)置的最大20,最小為1,均可以執(zhí)行)NSURLSessionConfiguration==ephemeralSessionConfiguration
和defaultSessionConfiguration效果一樣,沒(méi)有感覺(jué)到差別NSURLSessionConfiguration==backgroundSessionConfiguration
與上面2種不同,發(fā)現(xiàn)默認(rèn)值不同,在iOS10 系統(tǒng)上最大并發(fā)為3,在iOS12系統(tǒng)上為6,其他系統(tǒng)未驗(yàn)證(有同學(xué)持有不同系統(tǒng)的設(shè)備可以評(píng)論一下 我補(bǔ)上,取之于民用之于民),可以調(diào)低并發(fā),但是設(shè)置超過(guò)默認(rèn)值的并發(fā),系統(tǒng)并不會(huì)執(zhí)行,仍按照系統(tǒng)默認(rèn)的最大并發(fā)執(zhí)行,其他任務(wù)等待
補(bǔ)充: iOS9 系統(tǒng) 后臺(tái)并發(fā)是3 提供人: 繼剛大神
ps: 請(qǐng)注意后臺(tái)模式的時(shí)候,NSURLSession任務(wù)創(chuàng)建的延時(shí)問(wèn)題 (蘋(píng)果官方論壇的回復(fù)): https://forums.developer.apple.com/thread/14854
其他想法:
-
如果我們?cè)谝粋€(gè)網(wǎng)絡(luò)請(qǐng)求并發(fā)很多的app內(nèi),共用一個(gè)session,且未設(shè)置最大并發(fā)數(shù)的時(shí)候,尤其是包含一些請(qǐng)求響應(yīng)時(shí)間不給力的請(qǐng)求(甚至說(shuō)使用下載任務(wù)),可能會(huì)影響我們的其他的網(wǎng)絡(luò)請(qǐng)求,這個(gè)時(shí)候,可以通過(guò)設(shè)置最大并發(fā)數(shù)來(lái)增加并發(fā)數(shù)(討論的是一個(gè)服務(wù)器域名的 ),
但是是否可以通過(guò)新建一個(gè)session來(lái)再次增加并發(fā)呢? 為此,我進(jìn)行了一個(gè)驗(yàn)證:
- 基于AFNetworking創(chuàng)建了2個(gè)manager,分別對(duì)應(yīng)不同的config,通過(guò)打印manger的session實(shí)例,發(fā)現(xiàn)的確不是一個(gè)session,但是并發(fā)數(shù)量卻沒(méi)有按照我們想象的,各自持有一個(gè)并發(fā)數(shù),而是如下:
- A B 為ephemeralSessionConfiguration 和defaultSessionConfiguration 混合,使用默認(rèn)值的時(shí)候,
按照順序創(chuàng)建task,直到滿(mǎn)足4個(gè)默認(rèn)值,就停止了,
測(cè)試使用demo: https://github.com/yangfangkuo/downLoadTest