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 回调參数,server返回的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 回调參数,server返回的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()
    }
}

下载的图片原图

posted @ 2015-12-11 11:11  yxwkaifa  阅读(400)  评论(0编辑  收藏  举报