web-dev-qa-db-ja.com

完了ハンドラブロックでキャンセルされたNSURLSessionTaskをどのように処理しますか?

NSURLSessionDownloadTaskを作成し、後でそれが完了する前にキャンセルした場合、完了ブロックがまだ起動しているように見えます。

let downloadTask = session.downloadTaskWithURL(URL, completionHandler: { location, response, error in 
    ...
}

このブロック内でダウンロードタスクがキャンセルされたかどうかを確認して、ダウンロードがない場合に結果のダウンロードを操作しないようにするにはどうすればよいですか?

13
Doug Smith

ダウンロードタスクの場合、完了ハンドラはnillocation値で呼び出され、codeオブジェクトのNSError値はNSURLErrorCancelled。 Swift 3:

let task = session.downloadTask(with: url) { location, response, error in
    if let error = error as? NSError {
        if error.code == NSURLErrorCancelled {
            // canceled
        } else {
            // some other error
        }
        return
    }

    // proceed to move file at `location` to somewhere more permanent
}
task.resume()

またはSwift 2:

let task = session.downloadTaskWithURL(url) { location, response, error in
    if let error = error {
        if error.code == NSURLErrorCancelled {
            // canceled
        } else {
            // some other error
        }
        return
    }

    // proceed to move file at `location` to somewhere more permanent
}
task.resume()

データタスクの場合と同様に、完了ハンドラは、キャンセルされたかどうかを示すError/NSErrorを使用して呼び出されます。 Swift 3:

let task = session.dataTask(with: url) { data, response, error in
    if let error = error as? NSError {
        if error.code == NSURLErrorCancelled {
            // canceled
        } else {
            // some other error
        }
        return
    }

    // proceed to move file at `location` to somewhere more permanent
}
task.resume()

またはSwift 2:

let task = session.dataTaskWithURL(url) { data, response, error in
    if let error = error {
        if error.code == NSURLErrorCancelled {
            // canceled
        } else {
            // some other error
        }
        return
    }

    // otherwise handler data here
}
task.resume()
28
Rob