十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章給大家分享的是有關(guān)iOS中AFNetworking如何取消正在進(jìn)行的網(wǎng)絡(luò)請求的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)是專業(yè)的蟠龍網(wǎng)站建設(shè)公司,蟠龍接單;提供成都網(wǎng)站設(shè)計、成都網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行蟠龍網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!簡介
項目開發(fā)時,開發(fā)人員經(jīng)常會遇到一種情況,A控制器push進(jìn)入B控制器,B控制器正在進(jìn)行網(wǎng)絡(luò)請求,請求未結(jié)束時,點擊返回回到A控制器,現(xiàn)在問題出現(xiàn)了,B中網(wǎng)絡(luò)請求還在執(zhí)行,dealloc并未立即調(diào)用,為什么會發(fā)生這種情況?想在退出當(dāng)前控制器時取消掉正在進(jìn)行的請求,怎么做?
網(wǎng)絡(luò)請求的封裝
以AFNetworking為例,上我自己的網(wǎng)絡(luò)請求封裝主要代碼:
//單例模式 + (HttpManager *)sharedManager { static dispatch_once_t once; dispatch_once(&once, ^{ httpManager = [[HttpManager alloc] init]; }); return httpManager; } //網(wǎng)絡(luò)類初始化 - (id)init{ self = [super init]; if(self) { manager = [AFHTTPSessionManager manager]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; } return self; }
注意既然封裝為單例,manager在項目運行期間就只用初始化一次,所以我把它聲明為了一個成員變量?,F(xiàn)在來看看我的網(wǎng)絡(luò)請求調(diào)用形式:
[[HttpManager sharedManager] dataFromWithBaseURL:BaseURL path:url method:@"POST" timeInterval:10 params:parmas success:^(NSURLRequest *request, NSURLResponse *response, id JSON) { } failure:^(NSURLRequest *request, NSURLResponse *response, NSError *error, id JSON) { } error:^(id JSON) { } finish:^(id JSON) { }];
相信大部分開發(fā)者的封裝格式都是類似的,個別反人類的封裝格式我也沒遇到過。當(dāng)我在B調(diào)用網(wǎng)絡(luò)請求時,突然返回到A(此時B中請求還在執(zhí)行),但是B中dealloc方法并未立即調(diào)用,等過幾秒種后,B中請求的數(shù)據(jù)返回了,然后dealloc才調(diào)用。相信很多同學(xué)都遇到過這種情況,有人會想是否是block里面有對象產(chǎn)生了循環(huán)引用,才發(fā)生這種情況。我想說的是,如果真是循環(huán)引用,那就會導(dǎo)致控制器的dealloc方法一直不調(diào)用,而不是上述情況。
在我看來,應(yīng)該是使用了這種Block格式發(fā)起的網(wǎng)絡(luò)請求后,由于還在執(zhí)行,block里面并未得到響應(yīng),所以該block對當(dāng)前的控制器,有一種強引用的效果,導(dǎo)致控制器退出后,并未釋放掉,直到請求數(shù)據(jù)返回,block里面得到響應(yīng),才算完成,最終調(diào)用dealloc方法。
當(dāng)然,這只是我的見解,有不對的地方請指出來。
取消正在進(jìn)行的網(wǎng)絡(luò)請求
上面講了一大堆廢話,現(xiàn)在來講正題了。由于上述情況的原因,導(dǎo)致我們開發(fā)的app在一些非常規(guī)操作上,會產(chǎn)生一些不友好的效果?,F(xiàn)在要求就是在退出控制器B后,取消還在B中進(jìn)行的網(wǎng)絡(luò)請求。
要求清晰了,那么要怎么實現(xiàn),其實很簡單,貼上我的代碼:
- (void)cancelRequest { if ([manager.tasks count] > 0) { NSLog(@"返回時取消網(wǎng)絡(luò)請求"); [manager.tasks makeObjectsPerformSelector:@selector(cancel)]; //NSLog(@"tasks = %@",manager.tasks); } }
不要每次請求的時候都去初始化manager(AFHTTPSessionManager)對象,tasks里面裝的就是正在進(jìn)行的網(wǎng)絡(luò)請求,來一張圖就理解了:
manager里面的tasks裝的就是正在執(zhí)行的網(wǎng)絡(luò)請求。執(zhí)行cancel后,tasks就會清空,網(wǎng)絡(luò)請求會進(jìn)入失敗的狀態(tài),然后響應(yīng)failure block,得到一個error的信息,表示請求已經(jīng)成功取消了。
至于后臺服務(wù)器是否會因為中斷請求受影響,空閑的同學(xué)可以去測試下。
感謝各位的閱讀!關(guān)于“iOS中AFNetworking如何取消正在進(jìn)行的網(wǎng)絡(luò)請求”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。