2016-04-12 17 views
0

非同期に実行されるブロック/クロージャー内で、そのブロック内で何かを実行する前に、現在の状態をチェックしたいと考えています。ブロック/クロージャー完了後の現在のビュー状態の確認

これは、NSURLsession要求の後に次のView Controllerにセグメンテーションする共通の例です。

ここでは例です:

@IBAction func tappedButton(sender: UIButton) { 

    //This closure named fetchHistorical goes to the internet and fetches an array 
    //The response is then sent to the next view controller along with a segue 

    Order.fetchHistorical(orderID, completionHandler: { (resultEnum) ->() in 
      switch resultEnum { 
      case .Success(let result): 
       let orderItemsArray = result.orderItems!.allObjects 
       self.performSegueWithIdentifier("showExchanges", sender: orderItemsArray) 

      default: 
       let _ = errorModal(title: "Error", message: "Failed!") 
      } 
    }) 
} 

は、ユーザーがせっかちされていると仮定して、このボタンを3回タップ。

これは、この関数が3回呼び出され、次のビューコントローラーに分割しようとするたびに表示されることを意味します(警告:このビューはウィンドウ階層に表示されません! ")

私はこの問題にどのように対処していますか?それは閉鎖内のようなものですか?あなたが現在のviewcontrollerにまだいるかどうかを確認してください。そうであれば、segueingが有効です。もしそうでなければ、すでにセグエフしており、セグエを再度実行しないでしょう。

***クロージャが非同期に実行されるため、より一般的に、クロージャ内の現在の状態を確認していますか?

答えて

0

メインスレッドではクロージャが実行されていないので、ここで確認しても状態は正確になります(指定したとおり)。 GCDを使ってメインスレッドに行き、そこで状態をチェックすることができます。このコードを複数回実行しないようにするには、いくつかの方法があります。計算を実行するのに時間がかかる場合は、アクティビティインジケータを使用して、現時点でアプリがビジー状態であることをユーザーに知らせることができます。彼らは一度そのページが表示されるたびに押すことができますので、その後viewDidAppearに戻っfalseにそれを変更

var buttonWasTapped:Bool = false //class property 
@IBAction func tappedButton(sender: UIButton) { 
    if !self.buttonWasTapped{ 
     self.buttonWasTapped = true 
    } 
} 

:あなたは、ユーザーがまだボタンを押してのオプションを持っているしたい場合は、のようなタグを入れることができます。

0

完了するまでに時間がかかるタスクを開始するとき、私は2つのことを行います。ユーザーは何かが要求を受信したと複数回タップするからユーザーを防ぐためにというさらなる兆候があるように、ボタンを無効にし

  • が起こっている知っているように

    1. は、活動の指標のいくつかの並べ替えを表示します。

    アプリの正しい操作だけでなく、優れたユーザーエクスペリエンスも考慮する必要があります。