iOSはネットワークカートンがbuttonまたはcellをクリックして何度もpushのバグを解決するため

1862 ワード

需要


社内ネットワークのテスト環境は、ネットワークが制限されているため、カードを比較するため、buttonまたはcellを連続的にクリックすると、pushコントローラが複数回クリックされる可能性がある.コード変更範囲の最小範囲でこの問題を解決するにはどうすればいいですか?

方法一(推奨しない)

+ を用いるButtonのクリック方法を置き換える、 を設け、クリック後にタイマーをオンにし、ボタンのenable属性をオフにし、計時完了後にenableを開くことができる.cellについてはしばらく良いアイデアはありません.
メリット:
  • 変更比較小
  • 欠点:
  • まず彼は多くのタイマー
  • を起動します.
  • クリックが完了したら、素早く戻ると再度クリックできません!タイマーの実行が完了するまで待つ必要があります.

    方法2(問題を解決できるが、優雅ではない)


    一般的に、私たちのネットワーク要求フレームワークは から3層AFNまで、大量のblockをネストすることによって一連の の仕事を完成する.したがって、現在クリックするidおよびbuttonを記録するグローバルcell変数を設定することができ、最下層のネットワーク要求が開始されると、このボタン/cellのenableを閉じ、成功すると再び開くことができる.
    メリット:
  • 問題を解決できる
  • 欠点:
  • はcellクリックを記録し、変更も少なくない
  • 同時の問題
  • プロジェクトアーキテクチャも適用されない場合があります
  • 方法3(推奨)

    UINavigationControllerのうちのpushを制御方法は、コードが簡単で、現在のコントローラと押し込まれたコントローラが であるかどうかを判断するだけでよい.しかし、classと同じコントローラがほしいと思っていたら気まずいという欠点がある.コードは次のとおりです.
      - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
        {
            //cell push 
            if (![[super topViewController] isKindOfClass:[viewController class]]) {  //  , 
                [super pushViewController:viewController animated:animated];
            }
        }
    

    方法四(強く推奨)


    リンク、この先輩のやり方は巧みで、私の上のpushも解決しました.
    override func performSegueWithIdentifier(identifier: String, sender: AnyObject?) {
    if let navigationController = navigationController {
        guard navigationController.topViewController == self else {
            return
        }
    }
    
    super.performSegueWithIdentifier(identifier, sender: sender)
    }