-1

以下のコードを強化したい: 「submitData」ボタンをクリックすると、追加されたコードは完了ハンドラをキャンセルする必要があります。

func returnUserData(completion:(result:String)->Void){
  for index in 1...10000 {
     print("\(index) times 5 is \(index * 5)")
  }

  completion(result: "END");

}

func test(){
  self.returnUserData({(result)->() in
     print("OK")
  })
}

@IBAction func submintData(sender: AnyObject) {
    self.performSegueWithIdentifier("TestView", sender: self)
}

これを行う方法を教えてもらえますか?

4

1 に答える 1

1

NSOperationこれにはサブクラスを使用できます。計算をメソッド内に置きますmainが、定期的に をチェックcancelledし、そうであれば計算から抜け出します。

例えば:

class TimeConsumingOperation : NSOperation {
    var completion: (String) -> ()

    init(completion: (String) -> ()) {
        self.completion = completion
        super.init()
    }

    override func main() {
        for index in 1...100_000 {
            print("\(index) times 5 is \(index * 5)")

            if cancelled { break }
        }

        if cancelled {
            completion("cancelled")
        } else {
            completion("finished successfully")
        }
    }
}

次に、操作を操作キューに追加できます。

let queue = NSOperationQueue()

let operation = TimeConsumingOperation { (result) -> () in
    print(result)
}
queue.addOperation(operation)

また、いつでもキャンセルできます。

operation.cancel()

確かに、これはかなり不自然な例ですが、時間のかかる計算をキャンセルする方法を示しています。

NSOperation多くの非同期パターンにはキャンセル ロジックが組み込まれているため、サブクラスのオーバーヘッドが不要になります。既にキャンセル ロジックをサポートしているもの ( 、 など) をキャンセルしようとしている場合はNSURLSessionCLGeocoderこの作業を行う必要はありません。しかし、実際に独自のアルゴリズムをキャンセルしようとしている場合は、NSOperationサブクラスがこれを非常に適切に処理します。

于 2015-11-07T01:26:24.230 に答える