swift语言IOS8开发战记24 解析Json

在IOS中使用NSURLConnection实现http通信,NSURLConnection提供了异步和同步两种通信方式,同步请求会造成进程阻塞,通常我们使用异步的方式,不管同步还是异步,建立通信的基本步骤都是一样的:

1,创建NSURL

2,创建Request对象

3,创建NSURLConnection连接

第3步结束后就建立了一个http连接。

这里我们用一个开放的api做例子:

http://www.weather.com.cn/adat/sk/101010100.html

这是北京市的当前天气信息的json,我们首先来写一个同步的网络连接来获取这个json,新建一个工程,在页面上添加一个按钮,每次点击按钮就会输出json的内容到控制台,控制器代码:

import UIKit

class ViewController: UIViewController {

    @IBAction func showWeatherJson(sender: UIButton) {
        //创建url
        var url:NSURL! = NSURL(string: "http://www.weather.com.cn/adat/sk/101010100.html")
       //创建请求对象
        var urlRequest:NSURLRequest = NSURLRequest(URL: url)
        //创建响应对象
        var response:NSURLResponse?
        //创建错误对象
        var error:NSError?
        //发出请求
        var data:NSData? = NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: &response, error: &error)
        if error != nil
        {
        println(error?.code)
        println(error?.description)

        } else {
        var jsonString = NSString(data: data!, encoding: NSUTF8StringEncoding)
            println(jsonString)

        }

    }
}

运行结果如下:

下面来展示异步请求的代码:

import UIKit

class ViewController: UIViewController,NSURLConnectionDataDelegate,NSURLConnectionDelegate {

    @IBAction func getWeatherJson(sender: UIButton) {

        //创建NSURL对象
        var url:NSURL! = NSURL(string: "http://www.weather.com.cn/adat/sk/101010100.html")
        //创建请求对象
        var urlRequest:NSURLRequest = NSURLRequest(URL: url)
        //网络连接对象
        var conn:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self)
        conn?.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
        //执行
        conn?.start()

    }
}

然后在代理方法中添加代码即可,代理NSURLConnectionDataDelegate的代理方法如下:

    func connection(connection: NSURLConnection, willSendRequest request: NSURLRequest, redirectResponse response: NSURLResponse?) -> NSURLRequest? {
        //将要发送请求
        return request
    }
    func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) {
        //接收响应
    }
    func connection(connection: NSURLConnection, didReceiveData data: NSData) {
        //收到数据
    }
    func connection(connection: NSURLConnection, needNewBodyStream request: NSURLRequest) -> NSInputStream? {
        //需要新的内容流
        return request.HTTPBodyStream
    }
    func connection(connection: NSURLConnection, didSendBodyData bytesWritten: Int, totalBytesWritten: Int, totalBytesExpectedToWrite: Int) {
        //发送数据请求
    }
    func connection(connection: NSURLConnection, willCacheResponse cachedResponse: NSCachedURLResponse) -> NSCachedURLResponse? {
        //缓存响应
        return cachedResponse
    }
    func connectionDidFinishLoading(connection: NSURLConnection) {
        //请求结束
    }

定义一个NSMutableData类型数据流,在didReceiveData代理方法中收集数据流,代码如下:

 var jsonData:NSMutableData = NSMutableData()
    func connection(connection: NSURLConnection, didReceiveData data: NSData) {
        //收到数据
        jsonData.appendData(data)
    }

在connectionDidFinishLoading结束请求的代理方法内,解析jsonData数据流。代码如下:

func connectionDidFinishLoading(connection: NSURLConnection) {
        //请求结束
        var jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)
        println(jsonString)
    }

运行,同样得到结果:

时间: 2024-10-13 06:55:59

swift语言IOS8开发战记24 解析Json的相关文章

Swift语言IOS8开发战记25 网络通信Get和Post方式

Get是从服务器上获取数据,Post是向服务器传送数据.对于Get方式,服务器端用Requset.QueryString获取变量的值,对于Post方式,服务器端用Request.Form获取提交的数据.Get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内个个字段一一对应,在URL中可以看到.Post是通过HTTP Post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址.用户看不到这个过程. Get安全性非常低,Po

swift语言IOS8开发战记23 Core Data4

这后面的部分痘子的视频已经不讲了,我自己看着英文书试着给大家讲的,书名叫<Beginning IOS8 Programming with Swift>,感兴趣的同学自己搜一下哈.上一话中我们讲解了coredadta的用法,那么如何把coredata用到我们的工程中么,可以把上一话中的代码粘贴到我们工程的AppDelegate中,基本这套代码是通用的,注意有两句要修改一下,一句是: let modelURL = NSBundle.mainBundle().URLForResource("

swift语言IOS8开发战记20 Core Data1

Core Data字面意思就是核心数据,但它其实并不是一个数据库,它是一个框架,就像我们之前经常用到的Foundation一样,我们做持久化的时候,使用Core Data非常方便.下面展示的是Core Data框架的结构图: 我们来新建一个项目进行添加core data的学习. 新建一个项目,在项目中添加new file的时候可以看到专门有一个Core Data的选项 我们选择Data Model,创建,使用默认名字,现在看到工程里多出了一个Model.xcdatamodeld,点击已下按钮添加

swift语言IOS8开发战记21 Core Data2

新年到了,祝大家大家羊年快乐,喜气洋洋.上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用.这一话中建立的几个变量对照上一话中讲到的coredata中重要的变量,在AppDelegate中,添加如下代码: lazy var applicationDocumentsDirectory:NSURL = { let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDire

swift语言IOS8开发战记22 Core Data3

上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功.首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc(Info),不然后面会报错,我也不知道为什么. 然后在viewController中添加代码如下代码来实现: import UIKit import CoreData class ViewController: UIViewController { var tempInfo: Info! override func viewD

Swift语言IOS8开发战记27 Sketch初探

在之前我们新建了一个计算器项目,现在我想要给这个计算器项目制作一个桌面图标,可以使用Sketch,这是一款非常棒的软件.要想详细地学习这个软件请访问"Sketch中国",里面有很多专业的Demo和教材. 相对于PS这样的软件,Sketch简直就是为移动平台量身定做的. 打开Sketch,然后在右侧选择新建一个DeskTop HD,主页面有点像我们的Xcode,中间是画布,右侧是检查器. 可以使用快捷键A建立画板,你可以把画板当做图层的顶层,在上面自由发挥.然后我们使用U新建一个圆角矩形

swift语言IOS8开发战记15 Animation Delay

前几话我们实现了Review按钮的功能,今天来实现Share按钮的功能,由于两个功能的相似性,所以新建一个控制器,ShareViewController类,把ReviewViewController类的代码复制过去进行修改,share中不需要transforView和label,删掉,然后把按钮改成四个放到基view中,代码如下: let buttonWidth:CGFloat = 60 let buttonY:CGFloat = 200 //三个按钮相同的规格 let faceBtn = UI

Swift语言iOS8的蓝牙Bluetooth解析

开发中央步骤: 1.添加CoreBluetooth.framework框架到你的工程 2.继承两个协议:CBCentralManagerDelegate和CBPeripheralDelegate 个人写的demo,有详细注释.看不懂的在提出来,这里就不做过多的解释了. 1 // 2 // ViewController.swift 3 // CoreBluetooth 4 // 5 // Created by fanviwa on 15/4/23. 6 // Copyright (c) 2015年

Swift语言iOS8的蓝牙Bluetooth解析(转帖)

开发中央步骤: 1.添加CoreBluetooth.framework框架到你的工程  (目前swift只需要import CoreBluetooth就行了) 2.继承两个协议:CBCentralManagerDelegate和CBPeripheralDelegate 个人写的demo,有详细注释.看不懂的在提出来,这里就不做过多的解释了. 1 // 2 // ViewController.swift 3 // CoreBluetooth 4 // 5 // Created by fanviwa