zoukankan      html  css  js  c++  java
  • 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()
        }
    }

    下载的图片原图

  • 相关阅读:
    android 多线程
    Uva 10881 Piotr’s Ants 蚂蚁
    LA 3708 Graveyard 墓地雕塑 NEERC 2006
    UVa 11300 Spreading the Wealth 分金币
    UVa 11729 Commando War 突击战
    UVa 11292 The Dragon of Loowater 勇者斗恶龙
    HDU 4162 Shape Number
    HDU 1869 六度分离
    HDU 1041 Computer Transformation
    利用可变参数函数清空多个数组
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5038400.html
Copyright © 2011-2022 走看看