iOS中。蘋果提供了兩張方法實現多任務處理
- GCD (Grand Central Dispatch)
- 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是一個代碼塊,它可以被分到任何的隊列