美文网首页
swift多线程

swift多线程

作者: 秋天的渔夫 | 来源:发表于2017-10-20 11:48 被阅读0次

iOS中。苹果提供了两张方法实现多任务处理

  1. GCD (Grand Central Dispatch)
  2. NSOperationQueue 框架

GCD 简单示例

例1:

        //创建一个队列
        let queue = DispatchQueue(label: "com.test.myqueue")
        //在队列' queue' 中同步打印0~10
        queue.sync {
                for i in 0...10 {
                    print("❤️",i)
                }
        }
        
        //在'main queue'中打印10~20
        for i in 10...20 {
            print("M",i)
        }
        
        //结果:程序会卡住,在红星代码块执行完后再执行下面的

例2

        //创建一个队列
        let queue = DispatchQueue(label: "com.test1.myqueue")
        
        //在队列' queue' 中异步打印0~10
        queue.async {
                for i in 0...50 {
                    print("❤️",i)
                }
        }
        
        //在'main queue'中打印10~500
        for i in 10...500 {
            print("M",i)
        }
        
        //结果: 两个代码块并发执行

GCD队列 优先级

从上到下,优先级从高到低:

  • userInteractive
  • userInitiated
  • default
  • utility
  • background
  • unspecified

例1:

        //两个队列优先级相同
        let queue1 = DispatchQueue(label: "test1", qos: .userInteractive)
        let queue2 = DispatchQueue(label: "test2", qos: .userInteractive)
        
        queue1.async {
            for i in 0...10 {
                print("🍌",i)
            }
        }
        
        queue2.async {
            for i in 0...10 {
                print("❤️",i)
            }
        }
        // 结果:大致会"均匀交叉"执行两个代码块
    //两个队列优先级不相同
        let queue1 = DispatchQueue(label: "test1", qos: .background)
        let queue2 = DispatchQueue(label: "test2", qos: .userInteractive)
        
        queue1.async {
            for i in 0...10 {
                print("🍌",i)
            }
        }
        
        queue2.async {
            for i in 10...20 {
                print("❤️",i)
            }
        }
        // 结果:下面的代码块先执行(测试发现这个好像并不稳定~~~)

并发队列

let queue = DispatchQueue(label: "test",qos: .utility)
        
        queue.async {
            for i in 0..<10 {
                print("❤️",i)
            }
        }
        
        queue.async {
            for i in 0..<10 {
                print("🍌",i)
            }
        }
        //结果 按顺序执行
let queue = DispatchQueue(label: "test",qos: .utility, attributes:.concurrent)
        
        queue.async {
            for i in 0..<10 {
                print("❤️",i)
            }
        }
        
        queue.async {
            for i in 0..<10 {
                print("🍌",i)
            }
        }
        //结果  两个代码块并发执行

手动执行

attributes:.initiallyInactive,这样队列不会自动执行,需要手动触发queue.activate() :手动触发
attributes:[.concurrent,.initiallyInactive] 并发+手动触发:

延迟执行

  let delayQueue = DispatchQueue(label: "test",qos: .userInitiated)
        print(Date())
        
        let time:DispatchTimeInterval = .seconds(2)
        delayQueue.asyncAfter(deadline: .now() + time) {
             print(Date())
        }
let delayQueue = DispatchQueue(label: "test",qos: .userInitiated)
        print(Date())
        
        delayQueue.asyncAfter(deadline: .now() + 2) {
             print(Date())
        }

DispatchWorkItem

DispatchWorkItem是一个代码块,它可以被分到任何的队列

相关文章

  • swift多线程

    swift 2.0 和 3.0的多线程的区别 swift 2.0多线程的基础使用 dispatch_async(d...

  • iOS-Swift相关

    swift程序. 1.Swift多线程之Operation:异步加载CollectionView图片2.Swift...

  • Swift多线程:GCD进阶,单例、信号量、任务组

    Swift多线程:GCD进阶,单例、信号量、任务组 Swift多线程:GCD进阶,单例、信号量、任务组

  • 多线程

    参考文章:iOS多线程--彻底学会多线程之『GCD』Swift 3.0 GCD和DispatchQueue 使用解...

  • iOS/Swift多线程之---如何避免数据竞争(Data ra

    iOS/Swift多线程之---如何避免数据竞争(Data race)

  • swift3多线程之GCD

    多线程可以说ios进阶高级程序员的必修课,swift2的时候GCD还是继承的OC中多线程的C API,在swift...

  • Swift 5.x 多线程

    Swift多线程编程方案: Thread Cocoa Operation (Operation 和 Operati...

  • GCD

    iOS多线程 Swift4 GCD深入解析swift GCD 的一些高级用法GCD 之线程组(Dispatch G...

  • Swift:与OC混编

    目录一,条件编译二,KVO/KVC三,Swift调用OC四,OC调用Swift五,字符串六,多线程 一,条件编译 ...

  • 多线程

    iOS常见的多线程方案 GCD源码:https://github.com/apple/swift-corelibs...

网友评论

      本文标题:swift多线程

      本文链接:https://www.haomeiwen.com/subject/vpvmuxtx.html