2016-11-24 23 views
5

Chcę anulować połączenie Http w aplikacji działającej w tle.Anuluj połączenie HTTP w iOS

Oto mój kod:

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

} 

Jak mogę anulować go w dowolnym miejscu w programie?

+0

task.cancel() lub co masz na myśli? –

+0

'task.cancel()' – Adam

+0

jak zadanie devince w ViewController? – amirelo

Odpowiedz

1

Sposobem na to jest zachowanie odniesienia do zadania zamiast lokalnego "zadania".

Na przykład, poza swoimi viewDidLoad utworzyć:

var taskToReference: NSURLSessionDataTask! 

Następnie zmień swój kod zamiast let task = URLSession... zamiast robić taskToReference = URLSession....

Teraz masz referencyjny var, którego możesz użyć w dowolnym miejscu wewnątrz kontrolera widoku. Po prostu wykonaj taskToReference.cancel() w dowolnej klasie.

Aby zrobić coś, co można zrobić z dowolnego widoku w całej aplikacji, zamiast tworzyć var ​​w klasie, stwórz go w AppDelegate i zatrzymaj tam odnośnik!

w aplikacji delegata:

var taskToReference: NSURLSessionDataTask! 

Następnie w viewDidLoad, odwołać się do delegata aplikacji przed przedstawieniu app całej var:

let appDelegate = UIApplication.shared.delegate as! AppDelegate 

następnie zmienić swoje początkowe zadanie:

appDelegate.taskToReference = URLSession...