【问题标题】:How to get data from a Swift NSURLSession?如何从 Swift NSURLSession 中获取数据?
【发布时间】:2021-03-01 23:17:04
【问题描述】:

例如,我有以下代码:

let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
        var dann = NSString(data: data, encoding: NSUTF8StringEncoding)!
        self.str = dann
})
task.resume()

我想将数据传输到类中的变量(类中的str 变量)。字符串self.str = dann 不传达任何信息。我该怎么做?

【问题讨论】:

  • 你需要开始这个任务。 task.resume()

标签: swift nsurlsession


【解决方案1】:

我不确定 NSString 是你想要的类型。 JSON 可能是返回数据的格式,具体取决于 URL 的功能。我尝试了提供的代码并遇到了同样的问题,但是如果您将其视为 JSON(我使用 httpbin.org 作为虚拟 URL 源)并且它可以工作。

    let task = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: "http://httpbin.org/get")!, completionHandler: { (data, response, error) -> Void in
        do{
            let str = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [String:AnyObject]
            print(str)
        }
        catch {
            print("json error: \(error)")
        }
    })
    task.resume()

(感谢@sgthad 的建议编辑。编辑与问题不是特别相关,但仍想将代码更新为最新的。)

Swift 3 语法更新

let url = URL(string: "http://httpbin.org/get")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    guard let unwrappedData = data else { return }
    do {
        let str = try JSONSerialization.jsonObject(with: unwrappedData, options: .allowFragments)
        print(str)
    } catch {
        print("json error: \(error)")
    }
}
task.resume()

【讨论】:

  • 也不行。如果“println(str)”写在“task.resume()”之后,我们看到nil
  • 正确,因为异步任务的执行方式。因为在task.resume() 之后立即恢复执行,所以str 在异步调用返回到应用程序时在完成处理程序中设置之前为nil。
  • 有可能以某种方式做到这一点,那不是零,可以同步完成吗?
  • 好吧,你不想做同步网络调用。网络可能不容易使用,您的应用程序可能会因此受到影响。有很多方法可以进行同步网络调用,但我不能,出于好意,告诉你不要这样做,然后给你代码去做,然后说“但不要把它放在生产代码中”。在为 str 分配数据后,安排任何同步代码在完成块中(或在完成块调用的方法中)发生。
  • 这个问题没有说任何关于 JSON 的内容
【解决方案2】:

你可以试试 dispatch_async 吗?

let task = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) {(data, response, error) in
        dispatch_async(dispatch_get_main_queue(), {
           var dann = NSString(data: data, encoding: NSUTF8StringEncoding)!
           self.str = dann
        })
    }
    task.resume()

【讨论】:

  • shared NSURLSession 已经在主队列上调用完成块
【解决方案3】:

// 基于 Swift 3 的快速参考。

let task = URLSession.shared.dataTask(with: NSURL(string: "http://httpbin.org/get")! as URL, completionHandler: { (data, response, error) -> Void in
    do{
       let str = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! [String:AnyObject]
       print(str)
    } catch {
        fatalError("json error: \(error)")
    }
})
task.resume()

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多