json - 使用 NSURLSession 下载 JSON 不会返回任何数据

标签 json swift connection

我目前正在尝试从 URL 下载、解析和打印 JSON。 到目前为止我已经做到了这一点:

1) 一个类 (JSONImport.swift),用于处理我的导入:

    var data = NSMutableData();
        let url = NSURL(string:"http://headers.jsontest.com");
        var session = NSURLSession.sharedSession();
        var jsonError:NSError?;
        var response : NSURLResponse?;

        func startConnection(){

            let task:NSURLSessionDataTask = session.dataTaskWithURL(url!, completionHandler:apiHandler)
            task.resume();

            self.apiHandler(data,response: response,error: jsonError);

        }

        func apiHandler(data:NSData?, response:NSURLResponse?, error:NSError?)
        {
            do{
                let jsonData : NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary;
                print(jsonData);
            }
            catch{
                print("API error: \(error)");
            }
        }

我的问题是,数据在

do{
            let jsonData : NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary;
            print(jsonData);
        }

仍然为空。 当我调试时,连接成功启动,并以给定的 url 作为参数。但我的 jsonData 变量没有被打印。相反,catch block 会抛出错误,指出我的变量中没有数据:

API error: Error Domain=NSCocoaErrorDomain Code=3840 "No value."

有人可以帮我解决这个问题吗? 我错过了什么?

提前非常感谢大家!

[从 NSURL Connection 切换到 NSURLSession 后编辑]

最佳答案

这是一个关于如何使用 NSURLSession 和非常方便的“完成处理程序”的示例。

此函数包含网络调用并具有“完成处理程序”(数据可用时的回调):

func getDataFrom(urlString: String, completion: (data: NSData)->()) {
    if let url = NSURL(string: urlString) {
        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithURL(url) { (data, response, error) in
            // print(response)
            if let data = data {
                completion(data: data)
            } else {
                print(error?.localizedDescription)
            }
        }
        task.resume()
    } else {
        // URL is invalid
    }
}

您可以像这样在新函数中使用它,并带有“尾随闭包”:

func apiManager() {
    getDataFrom("http://headers.jsontest.com") { (data) in
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(data, options: [])
            if let jsonDict = json as? NSDictionary {
                print(jsonDict)
            } else {
                // JSON data wasn't a dictionary
            }
        }
        catch let error as NSError {
            print("API error: \(error.debugDescription)")
        }
    }
}

关于json - 使用 NSURLSession 下载 JSON 不会返回任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37673699/

相关文章:

swift - 如何判断 EKEvent 实例是否被拒绝?

ios - IBAction 没有声音和动画,swift

docker - Fluentd无法连接到ElasticSearch集群

ssl - PayPal PDT SSL 连接在我的插件域上挂起

php - 令人困惑的仅 PDO 问题 : Can't connect through socket/Access denied/Can't connect to server (shared host)

json - 在 JSON 中存储日期/时间的最佳方法是什么?

javascript - JSON.stringify : how to skip indentation for one (or more) objects

javascript - Ajax 调用循环,Ajax jQuery

json - jq:错误:无法用字符串索引数组

ios - 查找 WKInterfaceImage 的高度和宽度