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

    下载的图片原图

  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5038400.html
Copyright © 2011-2022 走看看