zoukankan      html  css  js  c++  java
  • iOS开发多线程在实际项目中的运用

    实际项目开发中为了能够给用户更好的体验,有些延时操作我们都会放在子线程中进行。

    今天我们就来聊聊多线程在实际项目中的运用。

    我们先来看看多线程的基础知识:

    1.多线程的原理:

            同一时间,CPU只能处理一条线程,也就是只有一条线程在工作。所谓多线程并发(同时)执行,

    其实是CPU快速的在多线程之间调度(切换)。如果CPU调度线程的时间足够快,就造成了多线程并

    发执行的假象。

    2.在实际项目开发中并不是线程越多越好,如果开了大量的线程,会消耗大量的CPU资源,CPU会

    被累死,所以一般手机只开1~3个线程为宜,不超过5个。

    3.多线程的优缺点:

    优点:1.能适当提高程序的执行效率

           2.能适当提高资源的利用率,这个利用率表现在(CPU,内存的利用率)

    缺点:1.开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,

    子线程占用512KB,如果开启大量的线程,会占用大量的内存空间,降低程序

    的性能)

         2.线程越多,CPU在调度线程上的开销就越大

         3.程序设计就越复杂:比如线程之间的通信,多线程的数据共享,这些

    都需要程序的处理,增加了程序的复杂度。

    4.在iOS开发中使用线程的注意事项:

        1.别将比较耗时的操作放在主线程中

        2.耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验

    好了,多线程在iOS中的开发概念性的东西就讲这么多,下面我们来模拟一种开发中的场景:

    我们在开发中经常会遇到,当你要缓存一组图片,但是这些图片必须要等到你缓冲好了后再来展现在UI上,

    可是我们缓存图片的时候用的是SDWebImage框架,缓存的操作是异步进行的,我们如何来做到等缓存好了

    再来执行以后的操作呢?下面讲个实现起来非常简单,方便的方法:

    我先来放上代码,后面进行讲解:

    //1.添加一个组
            let group = dispatch_group_create()
            
            //缓存图片
            for url in picURLs! {
                
                //2.将当前的下载操作添加到组中
                dispatch_group_enter(group)
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions.init(rawValue: 0), progress: nil, completed: { (_, _, _, _, _) in
                    
                    //3.离开当前组
                    dispatch_group_leave(group)
                    print("正在缓存中...")
                })
            }
            
            //通过闭包将数据传递给调用者(通知图片缓存完毕)
            dispatch_group_notify(group, dispatch_get_main_queue()) {
                print("缓存完毕!")
                finished()
            }
    

    从输出结果我们就可以看出来:我们做到了缓存完毕后再来执行以后的操作。

    是如何做到的呢?

    我在代码中已经用数字标出来了:

    1.我们首先用

    let group = dispatch_group_create()

    函数来创建一个组,用来存放缓冲的操作

    2.用这个函数做到把每一次的缓冲操作都添加到组中

    dispatch_group_enter(group)
    

     3.缓存图片我用的是SDWebImage框架,我们可以看到,我在缓冲完毕后离开当前组,用到如下函数

    dispatch_group_leave(group)

    用了这三步就能做到我们想要的功能吗?显然不是,做了这三部系统内部就会为我们做些事了,

    当我们离开当前组的时候,系统就会发出一个通知,我们来接收这个通知,当我们接收到这个通知的时候

    我们就可以执行finished的操作了,接收通知的函数是:

    dispatch_group_notify(group, dispatch_get_main_queue()) {
                print("缓存完毕!")
                finished()
            }

    以上就是一个非常方便的实现我们需要的功能的方法

    https://blog.csdn.net/qq_24904667/article/details/52679473

    对上述的代码,有任何疑问,可以在下方留言。 也可以给我发邮件咨询:673658917@qq.com 或者是直接加qq:673658917 转载请注明出处,谢谢合作。 睡觉舒服,那是给死人准备的,加油吧,一年后你会感谢现在的自己的。
  • 相关阅读:
    AAC-LC 是什么格式?和 AAC 有什么区别?
    AAC_LC用LATM封装header信息解析 Audio Specific Config格式分析
    AAC的AudioSpecificConfig细节
    AAC帧格式及编码介绍
    AAC 格式分析
    AAC头部格式,RTP打包格式
    RTP 打包H264与AAC
    程序员除了会CRUD之外,还应该知道什么叫CQRS!
    Neo4j数据库学习一:安装和数据类型常用命令简介
    【Neo4j查询优化系列】如何快速统计节点的关系数
  • 原文地址:https://www.cnblogs.com/lishanshan/p/9370951.html
Copyright © 2011-2022 走看看