JSON以快速不同的方式解析。哪一个使用?

时间:2015-12-01 13:11:30

标签: 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(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()
    }

这很好,但我无法理解该行发生了什么 -

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
                self.startParsing(data!)

我看到另一个教程使用如下函数来解析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!)

谢谢!

1 个答案:

答案 0 :(得分:0)

首先,最重要的是,在iOS 9中不推荐使用NSURLConnection。您应该使用NSURLSession代替。

至于你的问题,它们是关于异步网络读取而不是JSON解析。

NSURLConnection的:

NSURLConnection至少有两种不同的方法可以使用它。

  1. 您可以设置委托,启动连接,并等待调用委托方法(如connection:didReceiveData:)。
  2. 您可以使用类方法sendAsynchronousRequest,它接受​​完成块。
  3. sendAsynchronousRequest方法实现起来比较简单,但功能不强。在收到所有数据之前,您不会被调用,因此您无法执行显示进度指示器或将数据保存到磁盘以避免将所有内容保留在内存中的操作。

    如果您不需要这些内容,我建议您使用基于块的sendAsynchronousRequest方法。

    NSURLSession:

    <NSURLSession替代NSURLConnection,同时提供基于代理和基于块的方法,其优点和缺点与NSURLConnection类似。

    使用NSURLSession,如果您不需要细粒度控制,则可以更轻松地使用系统的共享会话(NSURLSession.sharedSession())。然后使用NSURLSession方法dataTaskWithRequest:completionHandler:创建NSURLSessionTask,并使用resume()方法启动任务。就像NSURLConnection一样,它在下载完成时调用你的完成块(闭包)。

    NSURLSession还允许您将数据直接下载到磁盘,设置安全连接,在下载数据时获取数据,以及许多其他选项(您可能需要也可能不需要。)< / p>

    编辑:

    以下摘自NSURLSession类引用sharedSession

      
        
    • (NSURLSession *)sharedSession讨论对于基本请求,URL会话类提供了一个共享的单例会话对象,   你是一个合理的默认行为。通过使用共享会话,您   只需几行就可以将URL的内容提取到内存中   代码。
    •   
         

    与其他会话类型不同,您不创建共享会话;   你只需要通过调用[NSURLSession sharedSession]来请求它。作为一个   结果,您不提供委托或配置对象。   因此,使用共享会话:

         

    从服务器到达时,无法以递增方式获取数据。

         

    您无法显着自定义默认连接行为。

         

    您执行身份验证的能力有限。

         

    您的应用不能执行后台下载或上传   没跑了。

         

    共享会话使用共享NSURLCache,NSHTTPCookieStorage,   和NSURLCredentialStorage对象,使用共享的自定义网络   协议列表(使用registerClass:和unregisterClass :)配置,   并基于默认配置。

         

    使用共享会话时,通常应该避免使用   自定义缓存,cookie存储或凭据存储(除非   你已经用NSURLConnection这样做了,因为有一个非常   很有可能你最终会超过这个能力   默认会话,此时您将不得不重写所有这些   以适用于您的自定义URL会话的方式进行自定义。

         

    换句话说,如果您正在使用缓存,cookie,   您可能应该是身份验证或自定义网络协议   使用[自定义]会话而不是[共享]会话。

    (我在引用中修正了Apple的文档中的一些拼写错误。我的更改在最后一句中用方括号括起来。)

    在线搜索NSURLSession SwiftNSURLSessionDataTask Swift,您应该能够找到有关使用NSURLSession的教程。这实际上非常简单。

    AlamoFire

    您也可以搜索“AlamoFire”。它是一个轻量级的Swift框架,提供简单的异步下载,包括内置的JSON处理。