Swift - 异步获取网络数据封装类
(自iOS9.0起,NSURLConnection.sendAsynchronousRequest被废除不用了。建议改用URLSession的dataTaskWithRequest方法。具体用法可以参考我的另一篇文章:Swift - 使用URLSession加载数据、下载、上传文件)
使用NSURLConnection.sendAsynchronousRequest()可以采用异步获取的方式取得数据。下面通过对数据获取类进行封装,演示如何进行数据请求与接收。(本文代码已升级至Swift3)
2,ViewController.swift (使用样例)
3,请求数据样例
使用NSURLConnection.sendAsynchronousRequest()可以采用异步获取的方式取得数据。下面通过对数据获取类进行封装,演示如何进行数据请求与接收。(本文代码已升级至Swift3)
1,HttpController.swift (数据获取封装类,结果处理协议)
import UIKit
//自定义http协议
protocol HttpProtocol{
//定义一个方法接收一个字典
func didRecieveResults(results:Dictionary<String, AnyObject>)
}
class HttpController:NSObject{
//定义一个可选代理
var delegate:HttpProtocol?
//定义一个方法运过来获取网络数据,接收参数为网址
func onSearch(url:String){
//定义一个NSURL
let url = URL(string: url)!
//定义一个NSURLRequest
let request = URLRequest(url: url)
//异步获取数据
NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue.main,
completionHandler: {(response:URLResponse?,data:Data?,error:Error?)
->Void in
//由于我们获取的数据是json格式,所以我们可以将其转化为字典。
let jsonResult = try! JSONSerialization.jsonObject(with: data!,
options: JSONSerialization.ReadingOptions.mutableContainers)
as! Dictionary<String, AnyObject>
//将数据传回给代理
self.delegate?.didRecieveResults(results: jsonResult)
})
}
}
import UIKit
class ViewController: UIViewController,HttpProtocol {
//获取网络数据的类
var eHttp = HttpController()
//接收频道列表的数组
var channelData:[AnyObject] = Array()
override func viewDidLoad() {
super.viewDidLoad()
//为HttpController实例设置代理
eHttp.delegate=self
//获取频道数据
eHttp.onSearch(url: "http://www.douban.com/j/app/radio/channels")
}
//实现HttpProtocol协议的方法
func didRecieveResults(results:Dictionary<String, AnyObject>){
if (results["channels"] != nil){
//如果channels关键字的value不为nil,获取的就是频道数据
self.channelData = results["channels"] as! Array
print(self.channelData[0]["name"] as! String) //私人兆赫
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
3,请求数据样例
{
"channels": [
{
"name_en": "Personal Radio",
"seq_id": 0,
"abbr_en": "My",
"name": "私人兆赫",
"channel_id": 0
},
{
"name": "华语",
"seq_id": 0,
"abbr_en": "",
"channel_id": "1",
"name_en": ""
},
{
"name": "欧美",
"seq_id": 1,
"abbr_en": "",
"channel_id": "2",
"name_en": ""
}
]
}

我想把这个改成闭包API封装,请问怎么做呢
类似这样方便些
let opt = try HTTP.GET("http://hangge.com")
opt.start { response in
//进行具体的响应操作...
}
老师,你这个挺好用的,能不能请你写个关于post请求的demo啊,现在开发中大多数还是post,我想用AFNetworking,但是语法老是报错,求老师能给个demo,跪谢啊
老师,我在获取网络数据的类中遵守NSURLConnectionDelegate,NSXMLParse的协议方法获取数据,结果运行viecontroller中按你那样调用on search方法就崩溃了,为什么呢