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")
        }

code

posted @ 2024-09-26 17:35  MrYu4  阅读(17)  评论(0编辑  收藏  举报