IOS网络-使用原生类操作

By | 2015年5月26日

一个标准的网络请求,包含了请求主体(NSURL、NSURLRequest)、请求操作者(NSURLConnection)、数据响应体(text、json、xml等),最后在处理返回的数据时,可能需要使用序列化将数据转换成我们需要的对象。

下面是请求一张二维码图片数据的代码:

private func qrCode(){
    //请求的链接,使用k780上的demo链接获取二维码图像
    let url = NSURL(string: "http://api.k780.com:88/?app=qr.get&data=test&level=L&size=6")!
    //将NSURL封装到Request中
    let request = NSURLRequest(URL: url)
    //使用异步发送请求,使用了NSOperationQueue开辟了一条新的线程来处理请求。
    //返回数据中,第一个参数是NSURLResponse,这里没有使用,第二个是返回的数据主体,正是我们需要的,第三个是可能包含的err
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { _, data, error in
        if error == nil{
            //如果没有错误返回,那就在主线程中更新UI,如果不在主线程更新,图片会很久才出来!
            dispatch_async(dispatch_get_main_queue()){
                self.imageView.image = UIImage(data: data)
            }
        }
    }
}

下面是返回JSON数据的Demo,需要使用NSJSONSerialization来进行序列化:

//获取天气数据,返回json数据
private func weather(){
    let url = NSURL(string: "http://api.k780.com:88/?app=weather.future&weaid=1&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json")!
    let request = NSURLRequest(URL: url)

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { _, data, error in
        if error == nil{
            //对可选值进行值绑定操作,如果存在,赋值给json常量,供if语句主体使用
            //由于返回的json整体是个字典类型,所以转为NSDictionary类型
            if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: nil) as? NSDictionary
            {
                //字典中的result键中,存在的是一个数组,所以转为NSArray
                let arr = json["result"] as? NSArray
                //这里只取数组中的第一个元素,它还是个字典类型
                let v = arr?.objectAtIndex(0) as? NSDictionary
                //在主线程中更新UI,通过字典的valueForKey获取对应的值
                dispatch_async(dispatch_get_main_queue()){
                    self.labl.text = v?.valueForKey("citynm") as? String
                }
            }
        }
    }// end send
}