如何在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()
}
}这就是我正在做的事情,当我的第一个调用完成时,我得到了令牌,并将令牌发送到另一个call.But。我现在实现的是同时获得两个调用,这在我的第二个call.My中导致了错误。我的目标是从第一个获得令牌,并在不使用处理器的情况下发送到第二个。我想通过队列来实现这一点。
发布于 2018-08-01 15:57:22
你可以在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
}
}并在您的应用程序接口调用完成块中调用self.sem.signal()方法。如有任何疑问,请发表意见。
https://stackoverflow.com/questions/51627701
复制相似问题