首页 > 代码库 > Swift中利用NSURLConnection进行同步异步下载(实例解析)
Swift中利用NSURLConnection进行同步异步下载(实例解析)
原创blog,转载请注明出处
http://blog.csdn.net/hello_hwc
一、同步异步两个概念
简单来讲,同步就是函数或者闭包(objective c中的block)执行完毕才能返回。异步是立刻返回,然后异步执行的动作结束后,再进行回调。二、同步下载
同步下载:
class func sendSynchronousRequest(_ request: NSURLRequest, returningResponse response:AutoreleasingUnsafeMutablePointer<NSURLresponse> error error:NSErrorPointer)->NSdata?参数:
request 要请求的URLRequest
reponse 回调参数,服务器返回的URL response
error 回调参数,判断是否有错误产生
以下以下载一张图片为例
可以发现,在view出现的时候,照片已经存在了,但是view载入较慢,因为要等待同步下载完成
完整的代码:
class ViewController: UIViewController{ var imageview = UIImageView(frame: CGRectMake(40,40,200,200)) override func viewDidLoad(){ super.viewDidLoad() imageview.contentMode = UIViewContentMode.ScaleAspectFit self.view.addSubview(imageview) let url = "http://f.hiphotos.baidu.com/image/pic/item/e1fe9925bc315c60191d32308fb1cb1348547760.jpg" let imageURL = NSURL(string:url) let urlRequest = NSURLRequest(URL: imageURL!) var response:NSURLResponse? var error:NSError? var data = NSURLConnection.sendSynchronousRequest(urlRequest,returningResponse:&response,error:&error) as NSData? if error == nil && data?.length > 0{ var image:UIImage = UIImage(data:data!)! imageview.image = image } } override func didReceiveMemoryWarning(){ super.didReceiveMemoryWarning() } }
三、异步下载
class func sendAsynchronousRequest(_ request: NSURLRequest, queue:NSOperationQueue! completionHandler handler:(NSURLResponse!,NSData!,NSError!))->Void参数:
request 要请求的URLRequest
queue 当请求完成或者出错的时候,闭包在这个队列上执行,更改UI要在主线程上执行
handler 当请求完成或者出错的时候,执行的闭包
闭包的几个参数
reponse 回调参数,服务器返回的URL response
error 回调参数,判断是否有错误产生
NSData 下载到的数据
同样以一张图片为例
可以发现,view立刻载入,但是图片不会立刻出现,等到图片下载完了,UI会更新。可以看到,异步下载不会阻塞UI,造成用户体验不好。
完整的代码
class ViewController: UIViewController{ var imageview = UIImageView(frame: CGRectMake(40,40,200,200)) override func viewDidLoad(){ super.viewDidLoad() imageview.contentMode = UIViewContentMode.ScaleAspectFit self.view.addSubview(imageview) let url = "http://f.hiphotos.baidu.com/image/pic/item/e1fe9925bc315c60191d32308fb1cb1348547760.jpg" let imageURL = NSURL(string:url) let urlRequest = NSURLRequest(URL: imageURL!) NSURLConnection.sendAsynchronousRequest(urlRequest,queue:NSOperationQueue.mainQueue(),completionHandler:{ (response: NSURLResponse!,data:NSData!,error:NSError!)-> Void in if error == nil && data?.length > 0{ var image:UIImage = UIImage(data:data!)! self.imageview.image = image } }) } override func didReceiveMemoryWarning(){ super.didReceiveMemoryWarning() } }
下载的图片原图
Swift中利用NSURLConnection进行同步异步下载(实例解析)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。