串行队列API多种服务调用

时间:2018-08-01 07:31:47

标签: ios swift queue

如何通过序列队列在Swift 4中进行多个Web服务调用(即在第一次调用完成后开始第二次调用)

 func allConcurretExce(completion: @escaping () -> ()) {
    let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent)
    let group = DispatchGroup()


    queue.async (group: group) {

        print("first call")

      self.userSignIn()


    }


    queue.async (group: group) {
        //group.wait(timeout : .now() + .seconds(3))
        print("second call")
        self.getMeData(token: self.token)


    }

    group.notify(queue: DispatchQueue.main) {
        completion()
    }
}

这是我的第一个电话完成时正在做的事情,我得到了令牌并将该令牌发送给另一个电话,但是我现在要实现的是一次同时获得两个电话,这导致第二个电话出错。从第一个获取令牌并发送给第二个令牌,而无需使用处理程序。我想通过队列来实现。

1 个答案:

答案 0 :(得分:0)

您可以快速使用DispatchSemaphore来实现。这将阻塞您的线程,直到一个任务结束,然后您可以启动另一个任务。请查看下面的示例。

class HttpClassForGetData: NSObject {

    var result: Any? = nil
    var sem = DispatchSemaphore(value: 0) // create semaphore

    init() {

        // create post request
        let url = URL("example.com")!

        var request = URLRequest(url: url)
        request.httpMethod = "GET"

        let session = URLSession(configuration: URLSessionConfiguration.default, delegate:nil, delegateQueue:OperationQueue.main)
        var DATA = session.uploadTask(withStreamedRequest: request) // use uploadTask with completion handler API here.and in your API call completion block call self.sem.signal() method.
        result = DATA

        // continue work in anybodyclass.swift class
        _ = sem.wait(timeout: .distantFuture) // lock calling thread, put this code at the end
    }

}

然后在您的API调用完成块中调用self.sem.signal()方法。如有疑问,请发表评论。