如何取消URL会话请求
问题描述:
我将多个图像上传到服务器,使用将图像转换为base64并将图像作为参数在API中发送。但是当我们一次又一次地调用api时,如何停止api调用按钮单击。我使用下面的代码来调用API。如何取消URL会话请求
在此先感谢
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类提供相应的和做动作按状态的需要,
public enum State : Int {
case running
case suspended
case canceling
case completed
}
答
您可以检查任务的结果。如果一切正常,你可以
task.resume()
,但如果没有
task.cancel()
的可能的复制[NSURLSession取消任务](https://stackoverflow.com/questions/19975642/nsurlsession-cancel-task) –
重复的可能性https://stackoverflow.com/questions/23518690/how-to-find-and-c安塞尔 - 一个任务功能于nsurlsession –