ios - 如何在网络断开时停止 URLSessionTask?

标签 ios swift url asynchronous semaphore

我正在使用 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/

相关文章:

swift - 在 Swift 中编写这个条件程序的最佳方法是什么?

ios - 添加 View 、删除 View 并再次添加 View 会破坏自动布局约束

ios - 没有报告的崩溃

ios - iPhone 5 错误的屏幕高度

iphone - UIImageView 边框颜色

java - 如何在没有uri的情况下将查询传递给rest模板中的url

Python:连接 URL 和整数

c++ - 如何获取我的 websocket 的服务器 IP 地址

ios - iOS 会屏蔽所有应用程序图标还是仅屏蔽主屏幕上的应用程序图标?

iOS - 我收到内存警告但不知道为什么