之前一段時間都在對網(wǎng)絡(luò)請求進(jìn)行優(yōu)化预烙,老大是后臺開發(fā)人員当纱,最近服務(wù)器由于并發(fā)請求太多,不能很快釋放恤溶,導(dǎo)致服務(wù)器經(jīng)常炸乓诽,所以要求安卓和iOS開發(fā)人員對網(wǎng)絡(luò)請求進(jìn)行優(yōu)化,采用連接池的概念來管理請求咒程。安卓在這方面有很大的優(yōu)勢问裕,網(wǎng)上有很多關(guān)于連接池的demo,iOS關(guān)于這方面的資料少之又少孵坚。項目中用到的是AFNetworking 3.0粮宛,之前對于底層知識了解甚少,趁著這次機(jī)會卖宠,對AFNetworking和NSURLSession進(jìn)行了一番研究巍杈。
AFNetworking以前用的是NSURLConnection + NSOperation,但是3.0版本移除了對NSURLConnectionOperation的支持扛伍,這意味著之前版本的“主力軍”被移除了筷畦,所以若是原封不動的用之前工程網(wǎng)絡(luò)請求部分的代碼一般都會報錯,所以大家都要嘗試用新版的AFNetworking來更新自己的網(wǎng)絡(luò)請求了刺洒。取消了NSURLConnectionOperation鳖宾,AFNetworking是用iOS7中新的網(wǎng)絡(luò)接口NSURLSessionOperation來代替的。NSURLSessionOperation在程序進(jìn)入后臺后會比NSURLConnectionOperation更加靈活逆航,更先進(jìn)鼎文。
NSURLSession
NSURLSession是NSURLConnection?的替代者,在2013年蘋果全球開發(fā)者大會(WWDC2013)隨ios7一起發(fā)布因俐,是對NSURLConnection進(jìn)行了重構(gòu)優(yōu)化后的新的網(wǎng)絡(luò)訪問接口拇惋。NSURLSession針對下載/上傳等復(fù)雜的網(wǎng)絡(luò)操作提供了專門的解決方案,針對普通抹剩、上傳和下載分別對應(yīng)三種不同的網(wǎng)絡(luò)請求任務(wù):NSURLSessionDataTask,?NSURLSessionUploadTask和NSURLSessionDownloadTask.撑帖。特別值得一提的是共享的Session將會復(fù)用TCP的連接,而每次都新建Session的操作將導(dǎo)致每次的網(wǎng)絡(luò)請求都開啟一個TCP的三次握手澳眷。復(fù)用TCP鏈接可以減少三次握手的次數(shù)胡嘿,加速網(wǎng)絡(luò)請求的時間,對服務(wù)器的并發(fā)數(shù)也會有很大的降低钳踊。
這個Session的復(fù)用可以完美的解決我的問題衷敌。接下來就是要如何復(fù)用我們的Session。
我們用AFNetworking進(jìn)行請求的時候箍土,都會使用如下的用法:
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
sessionManager.requestSerializer = [AFHTTPRequestSerializer serializer];
sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];
[sessionManager GET:urlString parameters:parameters progress:progressBlock success:successHandler failure:failureHandler]; ?
從上面的可以看到逢享,每次開啟一個網(wǎng)絡(luò)請求時,首先新建一個AFHTTPSessionManager吴藻,然后將相關(guān)的requestSerializer和reponseSerializer賦值瞒爬;最后發(fā)起相應(yīng)的GET/POST等請求。每次創(chuàng)建一個新的AFHTTPSessionManager沟堡,就會去創(chuàng)建一個session侧但,這樣就達(dá)不到復(fù)用session的效果了,如何才能復(fù)用這個session呢航罗,在這里可以用單列都解決這個問題禀横。
單例
在iOS開發(fā)中,有很多地方都選擇使用單例模式(Singleton)粥血,是一種常用的軟件設(shè)計模式柏锄。有很多時候必須要創(chuàng)建一個對象酿箭,并且不能創(chuàng)建多個,用單例就為了防止創(chuàng)建多個對象趾娃。單例模式的意思就是某一個類有且只有一個實例缭嫡。在應(yīng)用這個模式時,單例對象的類必須保證只有一個實例存在抬闷。而且 自行實例化 并向整個系統(tǒng)提供這個實例妇蛀。而這個類稱為單例類。一個單例類可以實現(xiàn)在不同的窗口之間傳遞數(shù)據(jù)笤成。
下面是使用AFNetworking對網(wǎng)絡(luò)請求進(jìn)行封裝
1.將AFNetworking引入到項目中
2.創(chuàng)建一個類评架,繼承AFHTTPSessionManager
下面是封裝的HQHttpTool類中的實現(xiàn)方法
另外,減少服務(wù)器并發(fā)數(shù)炕泳,服務(wù)器需要配置Keep-Alive和保持連接的時間纵诞,具體的我不知道
另外,app端可以設(shè)置最大并發(fā)數(shù),采用復(fù)用session的情況下喊崖,設(shè)置最大并發(fā)數(shù)為1的話挣磨,就會復(fù)用之前連接不會去建立新的連接:在AFURLSessionManager.m文件中
設(shè)置Keep-Alive屬性(默認(rèn)為NO):在AFURLSessionManager.m文件中,文件中是沒有添加這句代碼的荤懂,需要設(shè)置成YES則需加上
佛性程序媛一枚茁裙,有什么錯誤的地方,請多多指教节仿。