画像を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()
オブジェクトtask
をグローバル変数として作成すると、次の方法でどこでもキャンセルできます。
task.cancel()
または、オブジェクトsession
がURLSession
インスタンスの場合は、次の方法でキャンセルできます。
session.invalidateAndCancel()
以前のダウンロードが進行中の場合に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
}
タスクの結果を確認できます。そして、すべてが大丈夫なら、あなたはできます
task.resume()
しかしそうでない場合
task.cancel()