如何在 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()
}
}
这就是我在第一次调用完成时所做的事情,我得到了 token 并将该 token 发送到另一个调用。但是我现在实现的是同时获得两个调用,这导致我的第二次调用出现错误。我的目标是从第一个获取 token 并将其发送到第二个而不使用处理程序。我想通过队列来实现这一点。
最佳答案
您可以在 swift 中使用 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 调用完成 block 中调用 self.sem.signal() 方法。有疑问请评论。
关于ios - 串行队列 API 多个服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51627701/