【发布时间】:2017-11-26 08:45:07
【问题描述】:
我正在使用 URLSessionTask 来获取 url 的源代码。当互联网连接时,它工作得很好。
但是,当 Internet 断开连接时,我尝试构建。在模拟器中它是空白的,cpu 是 0%。影响的是My Tab Bar 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)
【问题讨论】:
-
你为什么使用信号量?
-
我想要从dataTask收到的数据。否则,由于 dataTask 是一个异步操作,我得到的是一个空字符串。
-
您不需要信号量:使用完成处理程序(回调)从异步操作中获取结果。
-
@Moritz 抱歉,当我尝试在完成处理程序(回调)中将数据放入 tableview 时。 Xcode 警告说“UITableView.dataSource 只能在主线程中使用”。它运行非常缓慢。如果我将 UITableView.dataSource 放在外面(回调),则视图只是空白.....它没有获取数据
-
@Moritz 它有效。你是我的英雄!非常感谢!
标签: ios swift url asynchronous semaphore