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()
    }
}

下载的图片原图

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值