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

    下载的图片原图

  • 相关阅读:
    C和指针 第十七章 经典数据类型 堆栈 队列 二叉树
    C和指针 第十六章 习题
    C和指针 第十六章 标准函数库 信号
    C和指针 第十六章 标准函数库 本地跳转setjmp.h
    C和指针 第十六章 标准函数库
    C和指针 第十五章 习题
    C和指针 第十五章 二进制I/O
    C和指针 第十五章 文件I/O
    C和指针 第十五章 输入输出缓冲
    C和指针 第十五章 错误报告perror和exit
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5038400.html
Copyright © 2011-2022 走看看