美文网首页
iOS基础之GCD

iOS基础之GCD

作者: flionel | 来源:发表于2017-10-18 18:14 被阅读40次
goal.jpg

GCD简介

GCD提供并管理了FIFO任务队列,提交到任务队列中的任务(Task)在一个线程池中执行。

同步sync, 异步async

let queue = DispatchQueue(label: "com.flion.myqueue")
queue.sync {
    for i in 0..<10 {
        print("⚽️ \(i)")
    }
}

for i in 100..<110 {
    print("🏀 \(i)")
}


let queue = DispatchQueue(label: "com.flion.myqueue")
queue.async {
    for i in 0..<10 {
        print("⚽️ \(i)")
    }
}

for i in 100..<110 {
    print("🏀 \(i)")
}

GCD优先级Quality Of Service

创建任务队列时可以指定QoS优先级,优先级从高到低如下所示,

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

let queue1 = DispatchQueue(label: "com.flion.queue1", qos: DispatchQoS.background)
let queue2 = DispatchQueue(label: "com.flion.queue2", qos: DispatchQoS.utility)


queue1.async {
    for i in 0..<10 {
        print("红色 \(i)")
    }
}

queue2.async {
    for i in 100..<110 {
        print("蓝色 \(i)")
    }
}

高优先级的队列中的任务会被优先执行,读者可以尝试指定不同的优先级,看一看效果。

串行serial,并行concurrent

串行队列中,同一时间只能执行一个任务,也就是说当前一个任务执行结束的时候,才开始执行后一个任务。

在并行队列中,队列中的任务依次出队列(dequeue serially),这些任务在同一时间一起执行,且这些任务可以以多种顺序结束,所以不能保证某一个任务最先执行完毕。

// 默认串行队列
let anotherQueue = DispatchQueue(label: "com.flion.anotherQueue", qos: .utility)

anotherQueue.async {
    for i in 0..<10 {
        print("白色 \(i)")
    }
}

anotherQueue.async {
    for i in 100..<110 {
        print("黑色 \(i)")
    }
}

anotherQueue.async {
    for i in 1000..<1010 {
        print("黑白色 \(i)")
    }
}
// 创建并行队列
let anotherQueue = DispatchQueue(label: "com.flion.anotherQueue", qos: .utility, attributes: .concurrent)

anotherQueue.async {
    for i in 0..<10 {
        print("白色 \(i)")
    }
}

anotherQueue.async {
    for i in 100..<110 {
        print("黑色 \(i)")
    }
}

anotherQueue.async {
    for i in 1000..<1010 {
        print("黑白色 \(i)")
    }
}

在iOS开发中,主线程队列时串行队列,global队列时并行队列,如下所示,

let main = DispatchQueue.main
let global = DispatchQueue.global()
let global2 = DispatchQueue.global(qos: .userInitiated)

延迟执行

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

参考链接

相关文章

网友评论

      本文标题:iOS基础之GCD

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