ios网络层优化深入浅出
網(wǎng)絡(luò)層是iOS開發(fā)必須掌握的部分,蘋果已經(jīng)將網(wǎng)絡(luò)請(qǐng)求封裝得非常易用了,看看NSURLRequest和NSURLConnection的文檔,你就知道怎么用了,這里我就不細(xì)講了。本文主要講網(wǎng)絡(luò)層的調(diào)用邏輯,以及如何優(yōu)化你的網(wǎng)絡(luò)請(qǐng)求,讓請(qǐng)求更有效率。
正常的網(wǎng)絡(luò)請(qǐng)求的過程一般經(jīng)歷四個(gè)過程:
1.組裝Request對(duì)象,創(chuàng)建Connection對(duì)象,當(dāng)Connection創(chuàng)建完畢后,系統(tǒng)底層會(huì)幫你完成3次握手、建立真正的連接等操作
2.收到回應(yīng),會(huì)調(diào)用ConnectionDelegate的didReceiveResponse方法,這是接收數(shù)據(jù)的第一步,你需要?jiǎng)?chuàng)建一個(gè)data緩沖區(qū)
3.然后一點(diǎn)點(diǎn)接收數(shù)據(jù),會(huì)重復(fù)調(diào)用didReceiveData,這個(gè)方法被調(diào)用的次數(shù)取決于設(shè)備當(dāng)時(shí)的網(wǎng)絡(luò)狀況和數(shù)據(jù)總量,你需要把接收到的數(shù)據(jù)一點(diǎn)點(diǎn)追加到data緩沖區(qū)里
4.接收完成,會(huì)調(diào)用connectionDidFinishLoading方法,表明數(shù)據(jù)全部接收完畢。
?
A:整個(gè)過程是異步的,但delegate方法永遠(yuǎn)會(huì)在主線程執(zhí)行,蘋果為保證動(dòng)畫(如scrollView滑動(dòng))的流暢,給了動(dòng)畫最高的優(yōu)先級(jí),所以界面動(dòng)畫會(huì)阻塞以上任意一個(gè)過程,保證界面不被卡住。于是你應(yīng)該明白了,盡量不要在做動(dòng)畫的時(shí)候去發(fā)網(wǎng)絡(luò)請(qǐng)求,這是徒勞的。
B:當(dāng)有若干個(gè)網(wǎng)絡(luò)請(qǐng)求同時(shí)發(fā)送時(shí),connection對(duì)象可以幾乎同時(shí)被構(gòu)建,但系統(tǒng)底層未必會(huì)為所有的連接對(duì)象都創(chuàng)建真正的網(wǎng)絡(luò)連接,至于底層最多能同時(shí)建立多少個(gè)真正的網(wǎng)絡(luò)連接,我還不清楚。建立了網(wǎng)路連接的請(qǐng)求,哪個(gè)先收到Response,就先處理哪個(gè),處理的過程是2-3-4過程依次調(diào)用,直到一個(gè)請(qǐng)求處理完畢,才接收下一個(gè)。于是你應(yīng)該明白了,要避免同時(shí)發(fā)送多個(gè)請(qǐng)求,尤其是關(guān)乎更新界面的請(qǐng)求,一定要單獨(dú)發(fā)。
C:如果網(wǎng)絡(luò)請(qǐng)求進(jìn)行了一半時(shí)退出程序,大家都知道這時(shí)候程序會(huì)被掛起,那么網(wǎng)絡(luò)連接怎么辦呢?實(shí)際上當(dāng)程序退出時(shí),系統(tǒng)并不會(huì)立即掛起應(yīng)用進(jìn)程,而是會(huì)延遲大概一秒,如果這樣請(qǐng)求還是沒有完成,系統(tǒng)底層會(huì)默默地幫你把數(shù)據(jù)都接收完,幫你保存請(qǐng)求超時(shí)時(shí)間那么久。比如你設(shè)置超時(shí)時(shí)間30s,30s內(nèi)重新打開應(yīng)用,數(shù)據(jù)就立刻全都一次性收到,如果沒打開,不好意思,下次打開程序時(shí),delegate的didFailWithError方法會(huì)被調(diào)用,通知你請(qǐng)求超時(shí)了。
總結(jié)
以上是生活随笔為你收集整理的ios网络层优化深入浅出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle RMAN中备份表空间名为'
- 下一篇: C语言数组作为传入参数