如何通过序列队列在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()
}
}
这是我的第一个电话完成时正在做的事情,我得到了令牌并将该令牌发送给另一个电话,但是我现在要实现的是一次同时获得两个电话,这导致第二个电话出错。从第一个获取令牌并发送给第二个令牌,而无需使用处理程序。我想通过队列来实现。
答案 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()方法。如有疑问,请发表评论。