web-dev-qa-db-ja.com

Swiftで進行中のHTTPリクエストをキャンセルするにはどうすればよいですか?

私のコードは[〜#〜] get [〜#〜]次のようなリクエストを行います:

_dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
    // ...

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
        if error != nil {
            println("error = \(error)")
            return
        }

        if let HTTPresponse = response as? NSHTTPURLResponse {
            if HTTPresponse.statusCode == 200 { // Successfully got response
                var err: NSError?
                if let json = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: &err) as? [String : AnyObject] {
                    // Success decoding JSON
                } else {
                    // Failed -> stop activity indicator
                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        self.activityIndicator.stopAnimating()
                    })
                }
            }
            task.resume()
        })
    }
}
_

リクエストが終了する前にviewWillDisappear()が呼び出された場合、リクエストを停止したいと思います。

現在、リクエストが終了する前にビューが消えないようです。進行中のGET/POSTリクエストをキャンセルする方法はありますか?

13
Joon. P

はい。ただし、外部アクセス用に保存する必要があります。taskにはcancel()を使用しているのと同じように使用できるメソッドresume()があります。

viewDidDisappear()の場合、オブジェクトプロパティとして持つことをお勧めします-_var currentTask: NSURLSessionTask?_、ディスパッチでは、_self.currentTask = ..._の代わりに_let task = ..._を使用し、viewDidDisappear()self.currentTask?.cancel()を呼び出します。

17
Michal