欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

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

来源: 开发者 投稿于  被查看 22718 次 评论:242

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多线程使用内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

    您可能感兴趣的文章:
    • IOS多线程编程的3种实现方法
    • IOS多线程开发之线程的状态

    用户评论