需求
公司的內(nèi)網(wǎng)測(cè)試環(huán)境因?yàn)榫W(wǎng)絡(luò)做過了限制,比較卡,所以測(cè)試連續(xù)點(diǎn)擊button
或者cell
時(shí)可能會(huì)多次push
控制器.如何在代碼改動(dòng)范圍最小的范圍內(nèi)來解決這個(gè)問題呢?
方法一(不推薦)
使用分類+運(yùn)行時(shí)
來替換Button
的點(diǎn)擊方法,可以設(shè)置一個(gè)時(shí)間間隔
,點(diǎn)擊過后開啟一個(gè)計(jì)時(shí)器,并關(guān)閉按鈕的enable
屬性,計(jì)時(shí)完成后再打開enable
.至于cell
暫時(shí)沒有什么好點(diǎn)子.
優(yōu)點(diǎn):
- 改動(dòng)比較小
缺點(diǎn):
- 首先他要啟動(dòng)不少定時(shí)器
- 如果點(diǎn)擊完成后,快速返回則不能再次點(diǎn)擊!必須等計(jì)時(shí)器執(zhí)行完畢
方法二(能解決問題,但不優(yōu)雅)
一般我們的網(wǎng)絡(luò)請(qǐng)求框架都會(huì)封裝
兩到三層AFN
,通過大量的block進(jìn)行嵌套來完成一系列的請(qǐng)求
工作.所以我們可以設(shè)置一個(gè)全局id
變量,用來記錄當(dāng)前點(diǎn)擊的button
和cell
,在最底層的網(wǎng)絡(luò)請(qǐng)求開始時(shí)將這個(gè)按鈕/cell的enable
關(guān)閉,成功后再次打開.
優(yōu)點(diǎn):
- 能解決問題
缺點(diǎn):
- 記錄cell點(diǎn)擊,改動(dòng)也不小
- 并發(fā)的問題
- 項(xiàng)目架構(gòu)可能也有不適用的地方
方法三(推薦)
我們可以控制UINavigationController
中的push
方法,代碼很簡(jiǎn)單,只需要判斷當(dāng)前的控制器和推入的控制器是否是相同的
一個(gè)class
就好了.但有一個(gè)缺點(diǎn),若本來就想push
一個(gè)相同的控制器就很尷尬了.代碼如下:
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
//cell因?yàn)榫W(wǎng)絡(luò)請(qǐng)求延遲而多次push同一頁面
if (![[super topViewController] isKindOfClass:[viewController class]]) { // 如果和上一個(gè)控制器一樣纳决,隔絕此操作
[super pushViewController:viewController animated:animated];
}
}
方法四(強(qiáng)烈推薦)
鏈接,這位前輩的方式很巧妙,也解決了我上面的缺點(diǎn)
.
override func performSegueWithIdentifier(identifier: String, sender: AnyObject?) {
if let navigationController = navigationController {
guard navigationController.topViewController == self else {
return
}
}
super.performSegueWithIdentifier(identifier, sender: sender)
}