web-dev-qa-db-ja.com

URLセッションリクエストをキャンセルする方法

画像をbase64に変換し、APIで画像をパラメーターとして送信して、複数の画像をサーバーにアップロードしています。しかし、APIを何度も呼び出すと、ボタンのクリックでAPIの呼び出しを停止する方法がわかります。以下のコードを使用してAPIを呼び出しています。

前もって感謝します

let urlPath: String = "URL"
        let url: URL = URL(string: urlPath)!
        var request1 = URLRequest(url: url)
        request1.httpMethod = "POST"
        let stringPost="imgSrc=\(image)"
        let data = stringPost.data(using: String.Encoding.utf8)
        // print("data\(data)")
        request1.httpBody=data

        request1.timeoutInterval = 60
        let _:OperationQueue = OperationQueue()
        let task = session.dataTask(with: request1){data, response, err in
            do
            {
                if data != nil
                {
                    print("data\(String(describing: data))")
                    if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary
                    {
                        DispatchQueue.main.async
                            {
                        print("json\(jsonResult)")


                    }
                }

            }
            catch let error as NSError
            {
                DispatchQueue.main.async
                    {

                print("error is \(error)")
                print("error desc \(error.localizedDescription)")
                }
            }}
        task.resume()
5
Gaurav Gupta

オブジェクトtaskをグローバル変数として作成すると、次の方法でどこでもキャンセルできます。

task.cancel()

または、オブジェクトsessionURLSessionインスタンスの場合は、次の方法でキャンセルできます。

session.invalidateAndCancel()
14
Yun CHEN

以前のダウンロードが進行中の場合にAPI呼び出しを再度許可したくない場合は、次のように実行できます。

次のように、タスク(URLSessionDataTaskタイプ)変数をクラスのグローバル変数として作成します。

let task = URLSessionDataTask()

次に、ボタンアクションで、タスクのダウンロードステータスを確認して、以下のようにします。

func uploadButtonPressed() {
    if task.state != .running {
        // Make your API call here
    } else {
        // Dont perform API call
    }
}

URLSessionDataTaskクラスによって提供されるrunningのような次の状態を利用し、必要に応じてアクションを実行できます。

public enum State : Int {
    case running
    case suspended
    case canceling
    case completed
}
5
Bharath

タスクの結果を確認できます。そして、すべてが大丈夫なら、あなたはできます

task.resume()

しかしそうでない場合

task.cancel()

2
Vitalii