2017-10-07 6 views
0

Je télécharge plusieurs images sur le serveur en utilisant convert image to base64 et envoie l'image dans une API en tant que paramètre. Mais quand nous appelons api encore et encore, puis comment arrêter api appelant sur le bouton cliquez. J'utilise le code ci-dessous pour appeler l'API.Comment annuler une demande de session d'URL

Merci à l'avance

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() 
+0

en double possible de [NSURLSession annulez la tâche ] (https://stackoverflow.com/questions/19975642/nsurlsession-cancel-task) –

+0

Possible de dupliquer https://stackoverflow.com/questions/23518690/how-to-find-and-c ancel-a-task-in-nsurlsession –

Répondre

4

Faire l'objet task comme une variable globale, alors vous pouvez annuler n'importe où par:

task.cancel() 

Alternativement, si l'objet session est une instance URLSession, vous peut l'annuler par:

session.invalidateAndCancel() 
1

Si vous ne variable ne souhaitez autoriser à nouveau l'appel d'API en cas de téléchargement précédent est en cours, vous pouvez le faire comme suit,

Faites votre tâche (type URLSessionDataTask) comme variable globale dans la classe comme suit,

let task = URLSessionDataTask() 

ensuite sur votre action bouton faire comme ci-dessous en vérifiant l'état de téléchargement de tâches,

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

Vous pouvez utiliser suivant les états comme la course qui est fournir par classe URLSessionDataTask et faire agir en conséquence selon votre besoin,

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

Vous pouvez vérifier le résultat de votre tâche. Et si tout va bien, vous pouvez

task.resume()

mais sinon

task.cancel()