【发布时间】:2014-07-24 17:38:00
【问题描述】:
我是 iOS 开发的新手。我正在使用 Swift,而且我对 Objective-C 的经验很少,所以其他一些可能相关的答案很难理解。我试图了解如何使用NSURLSession 从 Web 上的 JSON 文件中获取一些数据。我发现了一些关于从 URL 获取文件的有用信息,但就像其他 StackOverflow 用户 (NSURLSessionDataTask dataTaskWithURL completion handler not getting called) 一样,我听说 NSURLConnection 不是当前获取数据的方式,所以我正在尝试使用 NSURLSession .
当我从包中获取我的 JSON 时,我正在使用这个扩展来 字典(我很确定我从教程中得到了这段代码):
static func loadJSONFromBundle(filename: String) -> Dictionary<String, AnyObject>? {
let path = NSBundle.mainBundle().pathForResource(filename, ofType: ".json")
if !path {
println("Could not find level file: \(filename)")
return nil
}
var error: NSError?
let data: NSData? = NSData(contentsOfFile: path, options: NSDataReadingOptions(),
error: &error)
if !data {
println("Could not load level file: \(filename), error: \(error!)")
return nil
}
let dictionary: AnyObject! = NSJSONSerialization.JSONObjectWithData(data,
options: NSJSONReadingOptions(), error: &error)
if !dictionary {
println("Level file '\(filename)' is not valid JSON: \(error!)")
return nil
}
return dictionary as? Dictionary<String, AnyObject>
}
我想做一些类似的事情来从网络上的 JSON 文件中获取字典,因为我不希望将我的所有 JSON 文件都包含在包中。到目前为止,我有这个:
static func loadJSONFromWeb(urlstring: String) -> Dictionary<String, AnyObject>? {
let url = NSURL(string: urlstring)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: NSOperationQueue())
var error: NSError?
//I think I am using the completionHandler incorrectly. I'd like to access the data from the download
let task = session.downloadTaskWithRequest(NSURLRequest(URL: url), {(url, response, error) in println("The response is: \(response)")
})
task.resume()
//Isn't this contentsOfURL thing supposed to go with the connection stuff rather than the session stuff?
//How can I do this with a session? How can I create and use a completionHandler? This way seems clunky.
let data: NSData? = NSData(contentsOfURL: url)
if !data {
println("Could not load data from file: \(url), error: \(error!)")
return nil
}
println("The data is: \(data)")
let dictionary: AnyObject! = NSJSONSerialization.JSONObjectWithData(data,
options: NSJSONReadingOptions(), error: &error)
if !dictionary {
println("The file at '\(url)' is not valid JSON, error: \(error!)")
return nil
}
return dictionary as? Dictionary<String, AnyObject>
}
我认为我最需要回答的实际问题是:在哪里
是数据吗?我认为我没有正确使用会话和任务。我觉得我是
启动会话以连接到特定 URL 并使用 resume()
开始下载任务,但我不知道怎么做
从该 JSON 文件中获取数据。
如果我需要使用completionHandler 和类似于我在这里找到的请求:
(popViewControllerAnimated work slow inside NSURLSessionDataTask) 有人能解释一下completionHandler 中的“数据”与我要读取/下载的文件中的数据有何关系吗?我对completionHandler 以及如何正确使用它感到有些困惑。
我也查看了NSData 的文档,但我没有看到任何可以帮助我理解如何从我的会话中获取数据的内容(或者如何在我的会话中初始化NSData 的实例)。据我所知NSURLDownloadTask 的文档,任务本身并不是我访问数据的方式。看起来数据来自会话和任务通过completionHandler。
编辑:
我还查看了NSURLSessionDownloadDelegate 的文档,但我真的可以在 Swift 中使用一个示例来解释如何使用委托。这让我看到了 URL 加载系统编程指南。如果文档如此复杂,我猜使用会话的好处一定是巨大的。我将继续寻找有关 URL 加载系统的更多信息。
我发现这个答案很有帮助(但我太新了,我还不能投票):https://stackoverflow.com/a/22177659/3842582 它帮助我看到我可能需要学习使用委托。
我还查看了 URL 加载系统编程指南。我认为我真正需要的是完成处理程序的帮助。如何获取我的数据?或者,我是否已经使用NSData(contentsOfURL: url) 正确地做到了(因为我不认为我是)。
提前感谢您提供的任何帮助!
【问题讨论】:
标签: json swift nsurlsession