我正在使用 URLSessionTask 获取 url 的源代码。连接互联网后,它运行良好。
但是,当 Internet 断开连接时,我尝试构建。在模拟器中它是空白的,cpu 是 0%。影响的是 My Tab Bar Controller
也丢失了并且是空白的(这是我的初始 View Controller )。看来这个任务正在连接中?
我想要从 dataTask 接收到的数据,所以我使用 semaphore
使其同步。否则,由于 dataTask 是一个异步操作,我
get 是一个空字符串。
我该如何解决这个问题?
谢谢!
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)
最佳答案
更新:正如@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()
}
}
关于ios - 如何在网络断开时停止 URLSessionTask?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47494398/