2017-11-26 18 views
1

Ich benutze URLSessionTask, um den Quellcode von URL zu erhalten. Wenn das Internet verbunden ist, funktioniert es gut.Wie kann ich URLSessionTask stoppen, wenn das Internet getrennt wird?

Wenn jedoch das Internet getrennt wird, versuche ich zu bauen. Und im Simulator ist es leer und die CPU ist 0%. Was betrifft, ist, dass My Tab Bar Controller auch fehlt und leer ist (Es ist meine erste Ansicht Controller). Es scheint, dass diese Aufgabe unter Verbindung steht?

Ich möchte die Daten von dataTask erhalten, also verwende ich semaphore, um es synchron zu machen. Andernfalls, da dataTask eine asynchrone Aktion ist, was ich bekomme, ist eine leere Zeichenfolge.

Wie kann ich dieses Problem beheben?

Danke!

let urlString:String="http://www.career.fudan.edu.cn/jsp/career_talk_list.jsp?count=50&list=true" 
    let url = URL(string:urlString) 

    let request = URLRequest(url: url!) 
    let session = URLSession.shared 
    let semaphore = DispatchSemaphore(value: 0) 
    let dataTask = session.dataTask(with: request, 
            completionHandler: {(data, response, error) -> Void in 
             if error != nil{ 
              errorString = "Error!" 
             }else{ 
              htmlStr = String(data: data!, encoding: String.Encoding.utf8)! 
              //print(htmlStr) 
             } 

             semaphore.signal() 
    }) as URLSessionTask 

    //start task 
    dataTask.resume() 
    _ = semaphore.wait(timeout: DispatchTime.distantFuture) 
+1

Warum sind Sie eine Semaphore verwenden? – jcaron

+0

Ich möchte die Daten von dataTask erhalten. Andernfalls, da dataTask eine asynchrone Aktion ist, bekomme ich eine leere Zeichenfolge. –

+1

Sie benötigen kein Semaphor: Verwenden Sie einen Abschlusshandler (Callback), um das Ergebnis der asynchronen Operation zu erhalten. – Moritz

Antwort

1

Update: Wie @Moritz erwähnt, benutze ich endlich Abschluss-Handler (Callback).

func getforData(completion: @escaping (String) ->()) { 
    if let url = URL(string: "http://XXXXX") { 
     let request = URLRequest(url: url) 
     let task = URLSession.shared.dataTask(with: request) { 
      data, response, error in 
      if let data = data, let getString = String(data: data, encoding: String.Encoding.utf8), error == nil { 
       completion(getString) 
      } else { 
       print("error=\(error!.localizedDescription)") 
      } 
     } 
     task.resume() 
    } 
} 

Und in viewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 

    getforData { getString in 
     // and here we get the "returned" value from the asynchronous task 
     print(getString) //works well 

     //tableview should work in main thread    
     DispatchQueue.main.async { 
      self.newsTableView.dataSource = self 
      self.newsTableView.delegate = self 
      self.newsTableView.reloadData() 
     } 
} 
Verwandte Themen