2017-11-26 15 views
1

URLSessionTaskを使用してURLのソースコードを取得しています。インターネットが接続されているとうまく動作します。インターネットが切断されているときにURLSessionTaskを停止するにはどうすればよいですか?

しかし、インターネットが切断されると、私はビルドしようとします。シミュレータでは空白で、CPUは0%です。影響を受けるのはMy Tab Bar Controllerもなくなって空白(私の最初のビューコントローラ)です。このタスクは接続されているようですか?

私はdataTaskから受信したデータが必要なので、私はそれを同期させるためにsemaphoreを使用します。さもなければ、dataTaskが非同期アクションであるので、私は何か は空の文字列です。

この問題を解決するにはどうすればよいですか?

ありがとうございます!

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

なぜあなたは、セマフォを使用していますか? – jcaron

+0

dataTaskから受け取ったデータが必要です。それ以外の場合は、dataTask が非同期アクションであるため、空の文字列を取得します。 –

+1

セマフォーは必要ありません。完了ハンドラー(コールバック)を使用して、非同期操作の結果を取得します。 – Moritz

答えて

1

更新:@Moritzが述べたように、私は最後に完了ハンドラ(コールバック)を使用します。

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

との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() 
     } 
} 
関連する問題