iOS使用DispatchSemaphore实现串联请求

2019/6/25 posted in  Swift

DispatchSemaphore

信号量,用来控制并发访问资源的机制,可以控制并发数量。

串联请求

let sem = DispatchSemaphore(value: 0)

for i in 0..<10 {
    let task = DispatchQueue.init(label: "this is \(i) queue")
    task.async {

        sleep(1)
        print("async \(i), current thread: \(Thread.current)")
        sem.signal()
    }
    
    print("i \(i), current thread: \(Thread.current)")
    sem.wait(timeout: DispatchTime.distantFuture)
}
print("执行完毕 current thread: \(Thread.current)")
  • 创建信号量
let sem = DispatchSemaphore(value: 0)

创建信号量,初始可用资源数为0.

  • 等待信号量
sem.wait(timeout: DispatchTime.distantFuture)

sem的值不等于0,往下执行,同时将sem的值减1
sem的值等于0,则线程一直等待,不会执行下一次for循环,直到timeout设置的时间结束。

  • 发送信号量
sem.signal()

sem的值加1,这个时候如果有其它等待中的线程,则被唤醒执行。