解決iOS因為網絡卡頓點擊button或者cell多次push的bug

需求

公司的內網測試環境因為網絡做過了限制,比較卡,所以測試連續點擊button或者cell時可能會多次push控制器.如何在代碼改動范圍最小的范圍內來解決這個問題呢?

方法一(不推薦)

使用分類+運行時來替換Button的點擊方法,可以設置一個時間間隔,點擊過后開啟一個計時器,并關閉按鈕的enable屬性,計時完成后再打開enable.至于cell暫時沒有什么好點子.

優點:

  • 改動比較小

缺點:

  • 首先他要啟動不少定時器
  • 如果點擊完成后,快速返回則不能再次點擊!必須等計時器執行完畢

方法二(能解決問題,但不優雅)

一般我們的網絡請求框架都會封裝兩到三層AFN,通過大量的block進行嵌套來完成一系列的請求工作.所以我們可以設置一個全局id變量,用來記錄當前點擊的buttoncell,在最底層的網絡請求開始時將這個按鈕/cell的enable關閉,成功后再次打開.

優點:

  • 能解決問題

缺點:

  • 記錄cell點擊,改動也不小
  • 并發的問題
  • 項目架構可能也有不適用的地方

方法三(推薦)

我們可以控制UINavigationController中的push方法,代碼很簡單,只需要判斷當前的控制器和推入的控制器是否是相同的一個class就好了.但有一個缺點,若本來就想push一個相同的控制器就很尷尬了.代碼如下:

  - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        //cell因為網絡請求延遲而多次push同一頁面
        if (![[super topViewController] isKindOfClass:[viewController class]]) {  // 如果和上一個控制器一樣,隔絕此操作
            [super pushViewController:viewController animated:animated];
        }
    }

方法四(強烈推薦)

鏈接,這位前輩的方式很巧妙,也解決了我上面的缺點.

override func performSegueWithIdentifier(identifier: String, sender: AnyObject?) {
if let navigationController = navigationController {
    guard navigationController.topViewController == self else {
        return
    }
}

super.performSegueWithIdentifier(identifier, sender: sender)
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 2017.02.22 可以練習,每當這個時候,腦袋就犯困,我這腦袋真是神奇呀,一說讓你做事情,你就犯困,你可不要太...
    Carden閱讀 1,368評論 0 1
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,180評論 4 61
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,200評論 30 471
  • 炒豆豆閱讀 534評論 0 1
  • 我們為什么要擁有強大的內心?因為強大的內心能讓我們生活中,工作中都比較幸福。生活其實活的就是一個態度,你用什么樣的...
    小饅頭0601閱讀 283評論 0 0