2016-11-24 2 views
5

Je souhaite annuler la connexion Http dans l'application d'arrière-plan.Annuler la connexion HTTP dans iOS

Voici mon code:

override func viewDidLoad() { 
    super.viewDidLoad() 
    let url = URL(string: "my url") 
    let task = URLSession.shared.dataTask(with: url!) { data, response, error in 
     guard error == nil else { 
      print(error) 
      return 
     } 
     guard let data = data else { 
      print("Data is empty") 
      return 
     } 
     do { 
      if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary { 
       print("ASynchronous\(jsonResult)") 
      } 
     } catch let error as NSError { 
      print(error.localizedDescription) 
     } 
    } 

    task.resume() 

} 

Comment puis-je annuler partout dans le programme?

+0

task.cancel() ou ce que vous voulez dire? –

+0

'task.cancel()' – Adam

+0

Comment tâche définie dans ViewController? – amirelo

Répondre

1

Une façon de le faire est de garder une référence à la tâche au lieu de votre 'tâche' locale.

Par exemple, en dehors de votre viewDidLoad créer:

var taskToReference: NSURLSessionDataTask! 

Ensuite, changez votre code au lieu de le faire à la place let task = URLSession...taskToReference = URLSession....

Maintenant, vous avez une var de référence que vous pouvez utiliser n'importe où dans votre contrôleur de vue. Faites simplement taskToReference.cancel() n'importe où dans votre classe. Pour faire quelque chose que vous pouvez faire à partir de n'importe quelle vue dans votre application, au lieu de créer le var dans votre classe, créez-le dans votre AppDelegate et maintenez la référence là!

Dans votre délégué app:

var taskToReference: NSURLSessionDataTask! 

Puis dans votre viewDidLoad, obtenir une référence à déléguer l'application avant de référencer l'application à l'échelle var:

let appDelegate = UIApplication.shared.delegate as! AppDelegate 

Ensuite, changez votre tâche initiale:

appDelegate.taskToReference = URLSession...