一个标准的网络请求,包含了请求主体(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 }