Swift正在使用NSURLConnection异步下载同步(实例解析)「建议收藏」

Swift正在使用NSURLConnection异步下载同步(实例解析)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

原版的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()
    }
}

下载的图片原图

Swift正在使用NSURLConnection异步下载同步(实例解析)「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116710.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月17日 上午9:00
下一篇 2022年1月17日 上午9:00


相关推荐

  • grid web_DataGrid

    grid web_DataGrid首先安装Infragistics.NetAdvantage.for.ASP.NET.2007.Vol.2,然后在选择项中添加UltraWebGrid,使用方法如下:1、添加“总计”值绑定完数据后,添加如下代码UltraWebGrid1.Rows.Add();UltraWebGrid1.Rows.Add();…

    2022年10月6日
    7
  • Java代码中BeanUtils工具类的populate方法使用

    Java代码中BeanUtils工具类的populate方法使用这个工具的populate静态方法可以直接将map对象封装成实体类,简化代码编写,这里做一下记录。比如:Map<String,String[]>parameterMap=req.getParameterMap();UserloginUser=newUser();try{//所用的依赖是commons-beanutils-1.8.0.jar//importorg.apache.commons.beanutils.BeanUtils;//作

    2022年7月14日
    19
  • OpenClaw新手教程(详细图文),小龙虾养虾指南

    OpenClaw新手教程(详细图文),小龙虾养虾指南

    2026年3月13日
    2
  • 用ldap方式访问AD域的的错误解释

    用ldap方式访问AD域的的错误解释

    2021年8月14日
    74
  • pycharm的配置_pycharm怎么配置python环境变量

    pycharm的配置_pycharm怎么配置python环境变量一、Python解释器1、Python解释器计算机只能读懂0和1这样的二进制编码文件,所以需要一个东西将Python程序解释成计算机可以读懂并执行的二进制文件,这个东西就是Python解释器。在PyCharm中运行Python代码,您需要配置至少一个Python解释器。PyCharm支持以下解释器类型: 源Python解释器; 虚拟环境:(Virtualenv,Pipenv,andConda); 其他Python实现(IronP.

    2022年8月28日
    6
  • 数据仓库之OLAP与OLTP区别

    数据仓库之OLAP与OLTP区别关于数据仓库数据仓库的定义一个面向主题 集成的 稳定 随时间变化的数据集合 以用于支持管理的决策过程 数据仓库的目的通过集成不同的系统信息为企业提供统一的决策分析平台 帮助企业解决实际的业务问题 数据仓库的特征 面向主题 集成 稳定性即非易失得 随时间而变化即时变化的如今 数据仓库已经成为商务智能由数据到知识 由知识转化为利润的基础和核心技术数据库与数据仓库的区别实际讲的是 OLTP 与 OLAP 的区别 OLTP 联机事务处理 操作型处理 叫联机事务处理 OLTP On Line

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号