iOS中多线程的入门使用教程(Swift)

目录
  • 一、iOS的三种多线程技术
  • 二、基本使用
    • NSThread的基本使用
    • NSOperation的基本使用
    • GCD的基本使用
  • 总结

一、iOS的三种多线程技术

1、NSThread

–优点:NSThread 比其他两个轻量级,使用简单

–缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销

2、NSOperation

不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上

3、GCD

基于C语言的

二、基本使用

NSThread的基本使用

方式一:

//        block
        let thread =  Thread.init {
                print("1、----this is thread \(Thread.current) ")
        }
        thread.start()

方式二:

//        SEL
        let thread2 = Thread.init(target: self, selector: #selector(text), object: nil)
        thread2.start()
    @objc func text(){
        print("2、----this is thread \(Thread.current) ")
    }

方式三:\

 self.performSelector(inBackground: #selector(text2), with: nil)

输出

tips:可以给任意一个线程增加延迟看看

   print(thread.isCancelled)//是否取消
   print(thread.isExecuting)//是否在执行
   print(thread.isFinished)//是否完成
   print(thread.isMainThread)//是否是主线程

NSOperation的基本使用

方式一:

      let queue = OperationQueue.init()
//     最大线程数
        queue.maxConcurrentOperationCount = 2
        queue.addOperation {
            sleep(1)
            print("1111")
        }
        queue.addOperation {
            print("2222")
        }

输出结果如下:

方式二:可设置优先级

        let queue = OperationQueue.init()
      	let op =  BlockOperation.init {
            print("op")
        }
        op.queuePriority = .normal //设置优先级
        queue.addOperation(op)
        let op2 = BlockOperation.init {
            print("op2")
        }
        op2.queuePriority = .normal
        queue.addOperation(op2)

        queue.addOperation {
            print("op3")
        }

略作修改

        let queue = OperationQueue.init()
        let op =  BlockOperation.init {
            sleep(1)
            print("op")
        }
        op.queuePriority = .normal //设置优先级
        queue.addOperation(op)
        let op2 = BlockOperation.init {
            sleep(1)
            print("op2")
        }
        op2.queuePriority = .veryHigh
        queue.addOperation(op2)

        queue.addOperation {
            print("op3")
        }

输出如下:

优先级如下:

GCD的基本使用

方式一:queue.async 异步

   let queue =   DispatchQueue.init(label: "com.zjb.concurrent",attributes: .concurrent)
        for i in 0...15 {
            queue.async {
                sleep(1)
                print("this is \(Thread.current) \(i)")
            }
        }

方式二:queue.sync 同步

  let queue =   DispatchQueue.init(label: "com.zjb.concurrent",attributes: .concurrent)
        for i in 0...15 {
            queue.sync {
                sleep(1)
                print("this is \(Thread.current) \(i)")
            }
        }

附加网络上一段代码

        for i in 1...10 {
               DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
                   NSLog("DispatchQoS.QoSClass.default, %d", i)
               }

               DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async {
                   NSLog("DispatchQoS.QoSClass.background, %d", i)
               }

               DispatchQueue.global(qos: DispatchQoS.QoSClass.unspecified).async {
                   NSLog("DispatchQoS.QoSClass.unspecified, %d", i)
               }

               DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {
                   NSLog("DispatchQoS.QoSClass.userInitiated, %d", i)
               }

               DispatchQueue.global(qos: DispatchQoS.QoSClass.userInteractive).async {
                   NSLog("DispatchQoS.QoSClass.userInteractive, %d", i)
               }

               DispatchQueue.global(qos: DispatchQoS.QoSClass.utility).async {
                   NSLog("DispatchQoS.QoSClass.utility, %d", i)
               }
        }

优先级userInteractive最高、background最低

总结

到此这篇关于iOS中多线程入门使用的文章就介绍到这了,更多相关iOS多线程使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • IOS多线程开发之线程的状态

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续

  • IOS多线程编程的3种实现方法

    前言 在多线程简介中,我已经说明过了,为了提高界面的流畅度以及用户体验.我们务必要把耗时的操作放到别的线程中去执行,千万不要阻塞主线程. iOS中有以下3种多线程编程方法: NSThread Grand Centeral Dispatch(GCD) NSOperation和NSOperationQueue 1.NSThread 这是最轻量级的多线程的方法,使用起来最直观的多线程编程方法.但是因为需要自己管理线程的生命周期,线程同步.经常使用NSThread进行调试,在实际项目中不推荐使用. //

  • iOS中多线程的入门使用教程(Swift)

    目录 一.iOS的三种多线程技术 二.基本使用 NSThread的基本使用 NSOperation的基本使用 GCD的基本使用 总结 一.iOS的三种多线程技术 1.NSThread –优点:NSThread 比其他两个轻量级,使用简单 –缺点:需要自己管理线程的生命周期.线程同步.加锁.睡眠以及唤醒等.线程同步对数据的加锁会有一定的系统开销 2.NSOperation 不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上 3.GCD 基于C语言的 二.基本使用 NSThrea

  • iOS中多线程的经典崩溃总结大全

    前言 iOS崩溃是让iOS开发人员比较头痛的事情,app崩溃了,说明代码写的有问题,这时如何快速定位到崩溃的地方很重要.调试阶段是比较容易找到出问题的地方的,但是已经上线的app并分析崩溃报告就比较麻烦了. 本文将给大家总结介绍关于iOS中多线程的一些经典崩溃,下面话不多说了,来一起看看详细的介绍吧. 0x0 Block 回调的崩溃 在MRC环境下,使用Block 来设置下载成功的图片.当self释放后,weakSelf变成野指针,接着就悲剧了 __block ViewController *w

  • iOS中NSInvocation的基本用法教程

    前言 大家应该都有所了解,在 iOS中可以直接调用某个对象的消息方式有两种:一种是performSelector:withObject:再一种就是NSInvocation. 第一种方式比较简单,能完成简单的调用.但是对于>2个的参数或者有返回值的处理,那performSelector:withObject就显得有点有心无力了,那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作 NSInvocation的基本使用 方法签名类 // 方法签名中保存了方法的名称/参数/返

  • 详解iOS中多线程app开发的GCD队列的使用

    GCD的基本使用 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程. 获取主队列的方式: 复制代码 代码如下: dispatch_queue_t queue=dispatch_get_main_queue(); (1)使用异步函数执行主队列中得任务,代码示例: 复制代码 代码如下: // //  YYViewControll

  • 详解Unity中的ShaderGraph入门使用教程

    一,ShaderGraph 简介 简介: Unity2018版本之后推出了一个可编程渲染管线工具ShaderGraph,让我们可以通过可视化界面拖拽来实现着色器的创建和编辑. 官方话术: Shader Graph 使您能够直观地构建着色器.您无需编写代码,而是在图形框架中创建和连接节点.Shader Graph 提供反映您的更改的即时反馈,并且对于不熟悉着色器创建的用户来说非常简单. Shader Graph 仅与可编写脚本的渲染管线 (SRP) 兼容,即高清晰度渲染管线 (HDRP) 和通用渲

  • Android app开发中的Fragment入门学习教程

    在Android3.0上开始引入了一个新概念叫Fragment.它有自己的布局文件,可以作为组件排布,也可以相互组合去实现不同的布局显示.使用Fragment可以重复利用代码,并且可以满足不同设备尺寸的需求.Fragment不能单独存在,只能存在于Activity中,而一个Activity可以拥有多个Fragment.很重要的一点是,Fragment可以和Activity中的其它组件一起使用,无需重写所有Activity的接口.所以使用Fragment就可以这样来完成上例中"主界面-详细界面&q

  • linux中gdb的入门使用教程

    前言 gdb是linux下非常好用的一个调试工具,虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,这里简单介绍下gdb的使用方法,需要的朋友们下面来一起看看详细的介绍吧. 断点 在代码的指定位置中断,使程序在此中断. break <function> 在进入指定函数时停住 break <linenum> 在指定行号停住. break +/-offset 在当前行号的前面或后面的offset行停住.offiset为自然数. break filename:linenum 在

  • iOS中关于Swift UICollectionView横向分页的问题

    下面通过图文并茂的形式给大家介绍UICollectionView横向分页的问题,具体内容详情如下所示: 情况 直接看图 滚前 滚后 已经设置collectionView的isPagingEnabled为true了,可是出现了这种情况,原因就是collectionView的contentSize不够. <UICollectionView: 0x7fc565076000; frame = (0 0; 375 197); clipsToBounds = YES; gestureRecognizers

  • 在IOS中为什么使用多线程及多线程实现的三种方法

    多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径. 在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的. 然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个几乎同时发生的方式里执行不同的任务. 概要提示: iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone OS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改,只有主线程有直接修改UI

  • iOS中SQLite使用教程

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口,同样比起Mysql.PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快.SQLite第一个Alpha版本诞生于2

随机推荐