Ios JSON解析以不同的方式进行。用哪一个?
我一直在学习swift中JSON解析的教程。它有下面提到的用于解析和检索数据的代码Ios JSON解析以不同的方式进行。用哪一个?,ios,json,swift,Ios,Json,Swift,我一直在学习swift中JSON解析的教程。它有下面提到的用于解析和检索数据的代码 func jsonParsingFromURL () { let url = NSURL(string: "http://theappguruz.in//Apps/iOS/Temp/json.php") let request = NSURLRequest(URL: url!) NSURLConnection.sendAsynchronousRequest(req
func jsonParsingFromURL () {
let url = NSURL(string: "http://theappguruz.in//Apps/iOS/Temp/json.php")
let request = NSURLRequest(URL: url!)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
self.startParsing(data!)
}
}
func jsonParsingFromFile()
{
let path: NSString = NSBundle.mainBundle().pathForResource("days", ofType: "json")!
let data : NSData = try! NSData(contentsOfFile: path as String, options: NSDataReadingOptions.DataReadingMapped)
self.startParsing(data)
}
func startParsing(data :NSData)
{
let dict: NSDictionary!=(try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)) as! NSDictionary
for var i = 0 ; i < (dict.valueForKey("MONDAY") as! NSArray).count ; i++
{
arrDict.addObject((dict.valueForKey("MONDAY") as! NSArray) .objectAtIndex(i))
}
for var i = 0 ; i < (dict.valueForKey("TUESDAY") as! NSArray).count ; i++
{
arrDict.addObject((dict.valueForKey("TUESDAY") as! NSArray) .objectAtIndex(i))
}
for var i = 0 ; i < (dict.valueForKey("WEDNESDAY") as! NSArray).count ; i++
{
arrDict.addObject((dict.valueForKey("WEDNESDAY") as! NSArray) .objectAtIndex(i))
}
tvJSON .reloadData()
}
我看到了另一个教程,它使用如下函数解析JSON-
//Making the API Request
var request: NSURLRequest = NSURLRequest(URL: url)
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
//Preparing for the response
//声明一个数组,如下所示
var data: NSMutableData = NSMutableData()
//收到答复
1.
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
// Received a new request, clear out the data object
self.data = NSMutableData()
}
2.
func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
// Append the received chunk of data to our data object
self.data.appendData(data)
}
3.
func connectionDidFinishLoading(connection: NSURLConnection!) {
// Request complete, self.data should now hold the resulting info
// Convert the retrieved data in to an object through JSON deserialization
var err: NSError
var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
if jsonResult.count>0 && jsonResult["results"].count>0 {
var results: NSArray = jsonResult["results"] as NSArray
self.tableData = results
self.appsTableView.reloadData()
}
}
那么,上述两种编码与建议使用的编码之间有什么区别呢。请也说说关于
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
self.startParsing(data!)
谢谢 首先,也是最重要的一点,
NSURLConnection
在iOS 9中被弃用。您应该改用NSURLSession
至于你的问题,它们是关于异步网络读取而不是JSON
解析
NSURL连接:
NSURLConnection
至少有两种不同的使用方法
连接:didReceiveData:
)sendAsynchronousRequest
,它接受一个完成块李>
sendAsynchronousRequest
方法实现起来更简单,但功能没有那么强大。在收到所有数据之前,您不会被调用,因此您无法执行诸如显示进度指示器或在数据进入时将其保存到磁盘以避免将所有内容都保存在内存中之类的操作
如果您不需要这些东西,我建议使用基于块的sendAsynchronousRequest
方法
NSURL会议:
NSURLSession
替代了NSURLConnection
,还提供了基于代理和基于块的方法,其优缺点与NSURLConnection
类似
使用NSURLSession
,如果不需要细粒度的控制,则更容易使用系统的共享会话(NSURLSession.sharedSession()
)。然后使用NSURLSession
方法dataTaskWithRequest:completionHandler:
创建一个NSURLSessionTask,并使用resume()
方法启动任务运行。就像NSURLConnection一样,它在下载完成时调用完成块(closure)
NSURLSession
还允许您将数据直接下载到磁盘,建立安全连接,在下载时将数据分块获取,以及许多其他选项(您可能需要也可能不需要)
编辑:
以下是NSURLSession类参考中有关sharedSession
的摘录:
- (NSURLSession*)sharedSession讨论对于基本请求,URL会话类提供了一个共享的单例会话对象,该对象提供 你有合理的违约行为。通过使用共享会话,您可以 只需几行代码就可以将URL的内容提取到内存中 代码
nsursessionswift
或nsursessiondatatask Swift
,您应该能够找到有关使用nsursession的教程。其实很简单
阿拉莫菲尔
您还可以在“AlamoFire”上进行搜索。这是一个轻量级的Swift框架,提供简单的异步下载,包括内置的
JSON
处理。我建议sendAsynchronousRequest:
,使用块而不是使用委托模式。@Larme您能稍微解释一下sendAsynchronousRequest:方法及其操作吗。这将是对我问题的恰当回答。剩下的应该在方法的文档中。@Larme我们如何处理从异步请求收到的响应。它对我们有用吗?它真的有必要接收响应吗?嗯,有一个错误变量,您可以读取。如果您不想返回数据,这取决于您。您能提供一些使用NSURLSession的示例代码吗?我可以在AlamoFire中使用进度/活动指示器吗?不,我没有任何可以共享的NSURLSession代码(我编写的代码属于客户)。谷歌是你的朋友。至于阿拉莫菲尔的进展指标,我不知道。检查文档。我已经浏览了所有的网络,但我不能真正了解您提到的事实——“如果您不需要细粒度的控制,那么使用系统的共享会话(NSURLSession.sharedSession())就更容易了”。你能再解释一下吗
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
self.startParsing(data!)