2017-02-16 7 views
0

ユーザーは自分のアプリで名前に基づいて都市を検索した後、さまざまなソースから複数のAPI呼び出しを行って都市に関する情報を取得します。Swift:完了からメソッドを停止する

停止ボタンを追加して、たとえばWi-Fi接続に問題があり、検索に時間がかかるなど、ユーザーが検索を停止できるようにしたいとします。私は別のメソッドで私のAPI呼び出しを持っているので、ユーザーがStopボタンをクリックしたときにどちらが実行されているのかわかりません。

ユーザーが[停止]をクリックしたときに、すべての機能を停止する方法や、アプリで実行されているAPI呼び出しだけに精通している人はいませんか?

私の提案するソリューションは以下のとおりですが、誰かがより洗練されたソリューションを持っているかどうかを知りたいと思います。

+0

基本的にNSOperationを記述しているようです。私は車輪を再発明するのではなく、それを調べることをお勧めします。操作全体を独自のクラスに移動することで、提案されたタイムスタンプが混乱することなく_each_操作を個別に取り消すことができます。 – matt

+0

@mattありがとう、私はNSOperationに精通していません。あなたが私が見てみることをお勧めする良い参考資料はありますか? – Gibraltar

答えて

0

私の提案する解決策は、タイムスタンプを格納する2つの変数、永続変数、およびユーザーが検索をクリックしたときに呼び出されるアクションメソッドで作成された別のものです。これは次のように動作します:

  • ユーザーが検索にクリック
  • 永久変数は、検索の正確な時間で保存され
  • :2017_02_16_4:35:26(日付・秒までの時間)、で作成した変数アクションメソッドは、APIの呼び出しが完了すると永久的な変数
  • に一致するように作られているが、新しい情報がトリガーされた表示するセグエ前に、私は両方の変数が同期してまだ

  • であることを確認するためにチェックしますユーザーが停止ボタンをクリックすると、永久変数を時間に変更します停止ボタンがクリックされ、2つの変数が一致しないためにセグが実行されません。

    var permanentTimestamp = String() 
    
    @IBAction func searchButton(_ sender: Any) { 
        permanentTimestamp = // whatever the current time is 
        self.beginAPICalls() 
    } 
    
    func beginAPICalls() { 
        let uniqueCallTimestamp = permanentTimestamp 
    
        //... perform API calls and get information 
    
        if uniqueCallTimestamp == permanentTimestamp { 
          // perform segue 
        } else { 
          // the segue won't be triggered and the user can search again without having two searches go through 
        } 
    } 
    

私はブール値を使用して考えられのだが、ユーザーがインターネットに接続されているが、それは非常に遅い場合の潜在的な問題は次のようになります。ユーザーは最初のAPI呼び出しが完了する前に、検索(bool = true)、停止(bool = false)、検索(bool = true)の順にクリックできます。ブールが真であり、セグが起こることができますが、両方の呼び出しが行われます。

関連する問題