多线程:Operation一

  • 时间:2017-10-30
  • 分类:IOS开发
  • 1494 人浏览
[导读]进程进程:正在运行的应用程序叫进程进程之间都是独立的,运行在专用且受保护的内存空间中两个进程之间无法通讯通俗的理解,手机上同时开启了两个App。

1. 进程和线程 1.1 进程 进程:正在运行的应用程序叫进程 进程之间都是独立的,运行在专用且受保护的内存空间中 两个进程之间无法通讯

通俗的理解,手机上同时开启了两个App。这两个App肯定是在不同的进程中的。所以这两个App之间是独立的,内存中的数据不能互相窜来窜去,两个App之间也没有办法进行通讯。

两个App之间没有办法进行通讯?我说的是正常情况下。当然还是有不正常情况啊,例如使用iOS提供的极少数的几种进程间通讯的工具。

1.2 线程 线程:进程想要执行任务,必须要有线程,每个进程至少有一条线程。 线程就是用来干活的。 程序一启动,就会启动进程。进程默认开启一条线程。

干活的线程?对啊,活太多,或者不想彼此互相等着浪费时间,当然可以找几个人同时干了。
例如在项目上,产品经理需求都没有完全写完,也不妨碍先设计一个大概的数据框架啊。例如需求没有完全定下来,不妨碍UI童鞋提前设计啊,大不了再改嘛~ HOHO~怎么听上去都像是黑话。

1.3 多线程

单核CPU同一时间,CPU只能处理1个线程,只有1个线程在执行任务。

多线程的同时执行 : 其实是CPU在多条线程之间快速切换(调度任务)。

如果CPU调度线程的速度足够快,就造成了多线程同时执行的假象

如果线程非常多,CPU会在多条线程之间不断的调度任务,结果就是消耗了大量的CPU资源,效率下降:

每个线程调度的频率会降低 线程的执行效率会下降

iPhone手机是几核的?
A7 : iPhone 5S , 双核
A8: iPhone 6、iPhone 6 Plus,双核
A9:iPhone 6S、iPhone 6S Plus,双核
A10:iPhone 7、iPhone 7 Plus,2+2核

1.4 iOS中的多线程

刚才说了,iOS App一旦运行,默认就会开启一条线程。这条线程,我们通常称作为“主线程”

主线程的作用:

    如果主线程的操作太多、太耗时,就会造成App卡顿现象严重。所以,通常我们都会把耗时的操作放在子线程中进行,获取到结果之后,回到主线程去刷新UI。

    2. Operation

     

    我们来看看基础使用:

     

    使用BlockOperation创建operatoin,并直接运行。咱们看看会在哪条线程执行。

     

    打印一下看看运行的结果:

    这就是我们说,创建完Operation如果直接运行,就会在当前线程执行。也就是说,如果实在主线程创建并且start的,那就会在主线程执行;如果是在子线程创建并且start的,那就会在子线程执行。

     

    3. Basic Demo

    在这个例子里面,需求如下:
    1,在子线程加载每个图片的数据
    2,图片数据下载完毕之后,显示出来
    3,开始请求数据的时候,让指示符开始转动
    4,所有图片下载完毕后,指示符停止转动

     

    3. Basic Demo

    在这个例子里面,需求如下:
    1,在子线程加载每个图片的数据
    2,图片数据下载完毕之后,显示出来
    3,开始请求数据的时候,让指示符开始转动
    4,所有图片下载完毕后,指示符停止转动

     

    3.2 Swift中的do catch

    这个是Swift和OC不一样的地方。Swift中出现了可选值这么一个东西,这个不是这次的重点。想深入了解的童鞋可以参看这篇:?和 !的使用

    Swift 里有四种方法来处理错误:

       

      因为Demo里面用到了do catch,那咱们就只说do catch.
      在Swift的标准try中,是要配合do catch的。

      下面是do-catch语句的一般格式,如果do分句内的代码抛出了一个错误,它就被catch分句捕获,并判断由哪个分句来处理此错误。

      3.3 优先级

      在思维导图里面出现了两个优先级。一个是属于Operation 的,一个是属于OperationQueue的。那咱们分看看看这两个都是啥。

      3.3.1 Operation中的优先级

      Operation里面的这个叫做qualityOfService

       

      3.3.2 operationQueue 里面的优先级

      operationQueue中表示优先级的属性是queuePriority,表示操作在队列中的优先级。

      这些优先级都是相对的,并不是是说必须要执行完最高的才执行次重要的。这里面并没有一个特别严格顺序。只是在分配资源上有倾向性。如果队列需要有严格的执行顺序,还是要添加依赖关系的,这个是我们下一篇文章要分享的内容。

      4. 案例实现

      Operation 基本应用及优先级小案例。
      实现后效果如下:

       

       

       

      这个Demo里面,用了两种方法创建Operation。

      startBasicDemo,使用的是闭包创建Operation的方式。在startPriorityDemo里面使用的是自定义的构造方法创建的Operation,然后把任务数组加入到线程中。

      代码:

      View Code

       

      设置了优先级的Demo:

      View Code

       

      来源:本文为线上采编,如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除!
      标签: 多线程 Operation