美文网首页
iOS 多个网络请求 结果有依赖 完成后执行某一操作

iOS 多个网络请求 结果有依赖 完成后执行某一操作

作者: M_Baron | 来源:发表于2021-05-11 16:23 被阅读0次

    目标:

    请求要求串行要达到顺序执行,结果顺序返回。先请求先返回。

    实现思路:

    使用DispatchQueue 或者DispatchGroup 都可以实现顺序执行,但是并没有做到结果按照请求的顺序顺序返回。
    如果你再第二个接口想要利用第一个接口返回的数据,那单独使用队列或者队列组是达不到了。还需要结合信号量。

    信号量简介

    dispatch_semaphore_create(M)// 创建一个值为M的信号量
    dispatch_semaphore_wait(信号量,等待时间)//如果该信号量的值大于0,则使其信号量的值-1,否则,阻塞线程直到该信号量的值大于0或者达到等待时间。
    dispatch_semaphore_signal(信号量)//释放信号量,使得该信号量的值加1
    

    代码实例

    func dispatchSemaphore () {
        let group = DispatchGroup()
        let serialQueue = DispatchQueue(label: "request_queue")
        group.enter() // 开始
        serialQueue.async {
            let sema = DispatchSemaphore(value: 0)
            self.requestO(sema: sema)
            print("11")
            sema.wait() // 等待任务结束, 否则一直阻塞
            group.leave() // 结束
        }
    
        group.enter() // 开始
        serialQueue.async {
            let sema = DispatchSemaphore(value: 0)
            print("12")
            self.requestT(sema: sema)
            sema.wait() // 等待任务结束, 否则一直阻塞
            group.leave() // 结束
        }
    
        group.notify(queue: DispatchQueue.main) {
            // 全部调用完成后回到主线程,更新UI
        }
        // 让信号量 +1, 当>0时就代表绿灯可以走了
    }
    
    fileprivate func requestO(sema: DispatchSemaphore) {
        print("1")
        sema.signal()
    
    
    }
    
    fileprivate func requestT(sema: DispatchSemaphore) {
        print("2")
        sema.signal()
    }
    

    相关文章

      网友评论

          本文标题:iOS 多个网络请求 结果有依赖 完成后执行某一操作

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