Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios JSON解析以不同的方式进行。用哪一个?_Ios_Json_Swift - Fatal编程技术网

Ios 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

我一直在学习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()
    }
我看到了另一个教程,它使用如下函数解析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的内容提取到内存中 代码
    与其他会话类型不同,您不创建共享会话; 您只需通过调用[NSURLSession sharedSession]来请求它。作为一个 结果,您不提供委托或配置对象。 因此,通过共享会话:

    您无法在数据从服务器到达时以增量方式获取数据

    无法显著自定义默认连接行为

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

    应用程序运行时,您无法执行后台下载或上载 不跑

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

    使用共享会话时,通常应避免 自定义缓存、cookie存储或凭据存储(除非 您已经在使用NSURLConnection)这样做了,因为有一个 很有可能您最终会超出 默认会话,此时您必须重写所有这些会话 以与自定义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!)