2016-09-15 1 views
1

ユーザーがUICollectionViewのセルを選択したときに、JSONを取得するためにネットワークタスクを呼び出します。これはasynchronousなので、データが取得されている間はUIはアクティブのままです。ユーザがUICollectionViewの別のセルを選択できるようにします。私はこれを止めたくありませんが、最初の関数呼び出しを取り消し、現在選択されているセルに対して新しいメソッドを呼び出す方法が必要です。途中で機能をキャンセルするアイデアはありますか? Swift iOS

didDeselectItemAt indexPath:には、現在実行中のタスクをキャンセルする方法がありますか?

私は、関数を返すまで2番目のセルの選択を妨げるUI上のモーダル・ビューを待ってください。これは私の最善の選択ですか、それとも良い方法がありますか?

+1

NSOperationqueueを使用している場合は、キャンセルできます。 – Janmenjaya

答えて

1

NSOperationQueueを使用すると、非同期リクエストを作成して追跡し、必要に応じてキャンセルすることができます。あなたはNSOperationQueueからNSOperationsとして、あなたのネットワークタスクを提出することができ GCD cancel async block?

1

は、ここで、この他の質問への回答を参照してください。

NSOperationは、キャンセル方法があり、NSOperationQueuecancelAllOperationsの方法があります。

2

NSOperationQueueを使用して別のスレッドを維持すると、実行中のタスクに対する制御が可能になりますが、GCDは同じタスクを許可しませんが、両方とも特定のタスクメカニズムのバックグラウンドとフォアグラウンド実行に使用できません。

  • GCDは、同時に実行される作業単位を表すための軽量な方法です。あなたはこれらの作業単位をスケジュールしません。あなたのためにシステムがスケジューリングを行います。

  • NSOperationは、GCDと比較して少しオーバーヘッドを追加しますが、さまざまな操作の間に依存関係を追加し、それらを再利用、キャンセル、または中断することができます。

サンプル:

var backgroundQueue = NSOperationQueue() 
    backgroundQueue.addOperationWithBlock(){ 
     println("hello from background") 
     NSOperationQueue.mainQueue().addOperationWithBlock(){ 
      self.theLabel.text = "updated from main thread" 
     } 
    } 

は今、さまざまな操作がNSOperationQueuebackgroundQueue以上の変数を提供して行うことができます。

+0

GCDがなぜここで最善の解決策ではないのかを説明する+1。また、NSOperationとGCDの簡単な比較については、この回答を参照してください:stackoverflow.com/a/10375616/563802 – xpereta

+0

'addOperationWithBlock()'は、タスクをキャンセルできないNSOperationを作成します。つまり、あなたの提案されたソリューションは、OPの問題を解決することはできません。 – CouchDeveloper

関連する問題