async/await和Grand Central Dispatch代码切换
很多iOS开发开始学习结构化并发时已经用过了很多年Grand Central Dispatch,虽然从思想上二者区别很大,但是利用熟悉的东西去理解新的事物有助于提升学习理解的效率,接下来是这Grand Central Dispatch常见使用代码和转换代码。
异步
// 原代码
DispatchQueue.global().async {
print("1")
DispatchQueue.main.async {
print("3")
}
print("2")
}
// 转换
Task.detached {
print("1")
async let _ = await MainActor.run {
//也可以用 Task { @MainActor in
print("3")
}
print("2")
}
结合信号量实现的异步串行
// 源代码
DispatchQueue.global().async {
let s = DispatchSemaphore(value: 0)
DispatchQueue.global().async {
sleep(2) // 模拟耗时操作
print("1")
s.signal()
}
s.wait()
DispatchQueue.global().async {
sleep(1) // 模拟耗时操作
print("2")
s.signal()
}
s.wait()
print("3")
}
// 转换
Task.detached {
await Task {
sleep(2) // 模拟耗时操作
print("1")
}.value // .value必不可少
await Task {
sleep(1) // 模拟耗时操作
print("2")
}.value
print("3")
}
结合信号量实现的异步并行
// 源代码
DispatchQueue.global().async {
let s = DispatchSemaphore(value: 0)
DispatchQueue.global().async {
print("part1:1 or 2")
s.signal()
}
DispatchQueue.global().async {
print("part2:1 or 2")
s.signal()
}
s.wait()
s.wait()
print("3")
}
// 转换
Task.detached {
async let a1: () = await Task {
print("part1:1 or 2")
}.value
async let a2: () = await Task {
print("part2:1 or 2")
}.value
let (_, _) = await(a1, a2)
print("3")
}
本文来自博客园,作者:MrYu4,转载请注明原文链接:https://www.cnblogs.com/MrYU4/p/18433842/asyncawait-hegrand-central-dispatch-dai-ma-qie-hua