您的位置:首页 > 移动开发 > Swift

Swift - 同步请求和异步请求

2016-03-16 09:57 513 查看
(自iOS9.0起,NSURLConnection.sendSynchronousRequest被废除不用了。建议改用NSURLSession的dataTaskWithRequest方法。具体用法可以参考这篇文章:Swift - 使用NSURLSession同步获取数据(通过添加信号量)

使用NSURLConnection可以实现http通信。它提供了异步请求和同步请求两种通信方式。

注意:同步请求数据会造成主线程阻塞,必须请求结束后用户才能做其他的操作,所有通常在请求大数据或者网络不畅时不建议使用。

同步请求样例:

//创建NSURL对象
let url:NSURL! = NSURL(string: "http://www.hangge.com")
//创建请求对象
let urlRequest:NSURLRequest = NSURLRequest(URL: url)
//响应对象
var response:NSURLResponse?

do{
//发送请求
let data:NSData? = try NSURLConnection.sendSynchronousRequest(urlRequest,
returningResponse: &response)
let str = NSString(data: data!, encoding: NSUTF8StringEncoding)
print(str)

}catch let error as NSError{
//打印错误消息
print(error.code)
print(error.description)
}


由于同步请求数据会造成主线程阻塞,开发过程中更多使用异步请求数据的方式。这里描述iOS SDK自带的两种实现异步网络请求的方法。

GET请求方法:

let msg = "jimmy"
NSURLConnection.sendAsynchronousRequest(NSURLRequest(URL: NSURL(string: "\(url)?name=\(msg)")!), queue: NSOperationQueue()) {       (res:NSURLResponse!, data:NSData!, error:NSError!) -> Void in
if let d = data{
let getMsg = NSString(data: d, encoding: NSUTF8StringEncoding)! as String
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.label.text = getMsg
})
}
}


POST请求方法:

var req = NSMutableURLRequest(URL: NSURL(string: url)!)
req.HTTPMethod = "POST"
req.HTTPBody = NSString(string: "name=jimmy").dataUsingEncoding(NSUTF8StringEncoding)
NSURLConnection.sendAsynchronousRequest(req, queue: NSOperationQueue()) { (_, data, _)-> Void in
if let d = data{
var postMsg = NSString(data: d, encoding: NSUTF8StringEncoding)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.label.text = postMsg! as String
})
}
}


另外,可以使用第三方开源库Alamofire:

Alamofire是swift网络编程中替代AFNetworking的第三方开源库,作者为同一人,使用Alamofire需要在github上下载该库,然后将其引入到工程中。

通过Alamofire可以只需要几行代码就完成网络数据的请求,而且由于alamofire本就是异步请求,所以不必像第一种方法那样在更新UI的时候,还要跳到主线程,在Alamofire中,请求只要返回正确,便可以在必包函数中任意的做UI上的操作了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: