【发布时间】:2017-09-09 08:38:29
【问题描述】:
如何使用异步函数进行同步操作?
class MyClass {
static let shared = MyClass()
let operationQueue = OperationQueue()
let dispatchGroup = DispatchGroup()
func request(_ myRequestURL: URL) {
operationQueue.addOperation {
self.dispatchGroup.enter()
// Async function
Alamofire.request(myRequestURL).response { response in
print(response.request)
self.dispatchGroup.leave()
}
self.dispatchGroup.wait(timeout: .distantFuture)
}
}
}
MyClass.shared.request(A)
MyClass.shared.request(B)
MyClass.shared.request(C)
输出:C > A > B
预期:A > B > C
我知道有一个完成块方法可以做到这一点。但是请求会嵌套。
func request(_ myRequestURL: URL, completion: @escaping (_ data: Data?) -> Void) {
// Async function
Alamofire.request(myRequestURL).response { response in
completion(response.data)
}
}
MyClass.shared.request(A) { _ in
MyClass.shared.request(B) { _ in
MyClass.shared.request(C) { _ in
}
}
}
【问题讨论】:
-
让你的队列序列化:
operationQueue.maxConcurrentOperationCount = 1 -
是的。就像 javascript 中的 Promise。我如何以 Swifty 的方式使用 GCD?
-
请求是相互依赖还是可以并发执行?在前一种情况下,您最终将它们“嵌套”在下一个请求可能需要前一个请求的结果的地方。这也意味着异步任务是按顺序执行的。否则,如果请求是独立的,请同时运行它们并在所有请求完成后继续。您需要的方法取决于此决定。