• iOS多线程编程的知识梳理


    多线程编程也称之为并发编程,由于其作用大,有比较多的理论知识,因此在面试中也是受到面试官的青睐。在日常项目开发中,至少网络请求上是需要使用到多线程知识的,虽然使用第三方的框架比如AFNetworking进行网络请求比较简单,但是也是需要开发人员对多线程、block等知识有比较清晰的思路,才能在遇到问题的时候,能够有条理的找出问题并解决好。

    本篇文章的定位是梳理下在iOS开发中多线程的知识,也算是一个提纲,一来可以在学习或者是回顾多线程知识时候有个导向,二来也可以作为自己对多线程知识的一个检测,看自己是否能够根据这个提纲,做精细化加工。

    在iOS开发中,我认为主要是三个方面的知识要非常清楚:

    (一)多线程相关的知识

    (二)GCD的使用

    (三)NSOperation的使用

    首先是,多线程相关的知识

    (一)三者之间的关系:进程、线程、任务

    (二)引入多线程技术:概念、原理、优缺点、应用场景

    (三)线程中的任务执行是串行

    (四)实现多线程的技术:pthread、NSThread、GCD、NSOperation

    (五)线程的相关操作:创建、启动、运行、阻塞、销毁

    (六)线程间的相关操作:数据共享、线程之间的通信

    (七)关于线程的相关术语:主线程、子线程

    然后是,GCD的使用

    (一)在GCD中有两个概念需要明确:函数、队列

    (二)两种函数:同步函数--在当前线程中执行任务,不具备开启新线程的能力

            异步函数--在新的线程中执行任务,具备开启新线程的能力

    (三)两种队列:串行队列--一个任务执行完成后,再执行下一个任务

            并发队列--多个任务同时进行

    (四)三种队列实例:主队列、自创建串行队列、全局并发队列

    (五)公式就是:用______函数往______队列中添加任务。

    组合起来就是六种情况:

    用同步函数,往主队列中,添加任务--没有开启新线程、串行执行任务(这种方式会形成死循环!

    用同步函数,往自创建串行队列中,添加任务--没有开启新线程,串行执行任务

    用同步函数,往全局并发队列中,添加任务--没有开启新线程、串行执行任务

    用异步函数,往主队列中,添加任务--没有开启新线程、串行执行任务

    用异步函数,往自创建串行队列中,添加任务--有开启新线程、串行执行任务

    用异步函数,往全局并发队列中,添加任务--有开启新线程、并发执行任务(这个才是发挥GCD效能的方式!

    (六)线程间的通信:从子线程回到主线程中执行任务

    (七)GCD常用方式:延迟执行、一次性执行、队列组的使用

    最后是,NSOperation的使用

     对NSOperation主要是两个大块:NSOperation子类的使用、NSOperation与NSOperationQueue的结合使用。

    首先NSOperation是抽象类,不能直接使用其实例化。NSOperation子类的使用有三种方式:

    (一)NSInvocationOperation类

    将任务放置在该类的实例化对象中,然后执行,一个NSInvocationOperation对象中只能放置一个任务。单独这样使用,任务都是在主线程中执行的,只有将该类的实例化对象添加到NSOperationQueue队列中使用,才会开启新线程执行任务。

    (二)NSBlockOperation类

    该类和NSInvocationOperation类的区别是,一个NSBlockOperation对象可以放置多个任务,然后在调用执行方法。若添加到NSBlockOperation对象中的任务数>1,就会开启新的线程异步执行任务。

    (三)自定义NSOperation子类

    然后就是NSOperation与NSOperationQueue的结合使用,结合使用无非就是创建一个NSOperationQueue对象,然后将NSOperation的子类的实例化对象添加到NSOperationQueue对象中,有两个方面需要注意:

    (一)NSOperationQueue的配置:设置最大并发数、设置任务的优先级、设置任务间的依赖关系、设置任务完成后的监听回调。

    (二)NSOperationQueue的操作:取消所有或者单个任务、暂停或者恢复任务。

    值得一提的应用场景,比如用UITableView加载很多数据显示的过程,网络请求和数据解析的确是放置在子线程中异步进行,不能放置在UI主线程中来进行这么耗时的操作,不然UI界面就会被“卡死”。但是开线程毕竟也是需要内存的,子线程在执行任务的时候也的确是需要消耗性能的,这样一来多多少少也是会对UI界面造成影响的,比如滑动界面的使用发现有稍微的不流畅?因此为了更好的提高用户体验,对多线程更可控,可以使用NSOperationQueue队列的暂停任务的操作,当用户在滑动界面时,暂停其他耗性能的子线程的活动。

  • 相关阅读:
    屏幕尺寸相关
    关于sqlite的数据库操作
    Service服务
    BroadcastReceiver广播接收器
    将博客搬至CSDN
    win7+WinDbg调试系统内核
    驱动
    驱动开发,走起!!哈哈
    动态链接库DLL
    2013年12月24号感受
  • 原文地址:https://www.cnblogs.com/cchHers/p/11432271.html
Copyright © 2020-2023  润新知