如何使用异步函数进行同步操作?
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
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)
}
}
Run Code Online (Sandbox Code Playgroud)
MyClass.shared.request(A){_ in
MyClass.shared.request(B){_ in
MyClass.shared.request(C){_ in …
我想执行多个 Alamofire 请求。但是,由于数据依赖性,新请求应仅在前一个请求完成时开始。
我已经用更一般的异步请求示例提出了一个问题,该示例使用OperationQueue. 但是,我没有成功地使用 Alamofire 实现相同的目标。
public func performAlamofireRequest(_ number: Int, success: @escaping (Int) -> Void)->Void {
Alamofire.request(String(format: "http://jsonplaceholder.typicode.com/posts/%i", number+1)) // NSURLSession dispatch queue
.responseString { response in // Completion handler at main dispatch queue?
if response.result.isSuccess {
// print("data")
} else if response.result.isFailure {
// print("error")
}
success(number) // Always leave closure in this example
}
}
Run Code Online (Sandbox Code Playgroud)
为了确保在下一个请求开始之前完成请求,我使用OperationQueue如下:
let operationQueue = OperationQueue.main
for operationNumber in 0..<4 { // Create some operations
let …Run Code Online (Sandbox Code Playgroud) 好的,我对这一个感到疯狂......
我正在使用Alamofire 4.x(Swift 3和XCode 8.1).我需要从需要身份验证的站点获取和解析几个html请求(不幸的是没有json API).然后用Fuzi解析HTML,这个进展可能需要一些时间,所以我打算使用ProgressHUD(准确地说PKHUD)让用户知道发生了什么.我还需要获取一些不在身份验证后面的html.
我创建了一个结构和函数来处理整个网络进程并解析数据.
我设法执行请求并获取我需要的数据,但我似乎无法弄清楚如何在正确的时间进行HUD更新.
到目前为止,这是我的代码:
import Alamofire
import Fuzi
import PKHUD
struct MyMSCProvider {
static let baseUrl = "http://mastersswimming.ca"
//I tried with or without a custom queue - same result
static let processingQueue = DispatchQueue(label: "com.colddiver.processing-queue", qos: .utility)
static func fetchData(data: MscRequest) {
if data.profile || data.log {
//Authenticate first!
HUD.show(.labeledProgress(title: "Authenticating", subtitle: ""))
let requestUrl = "\(baseUrl)/MyMscPage.jsp"
let parameters = ["locale": "en", "username": data.user.username, "password": data.user.password]
Alamofire.request(requestUrl, method: .post, parameters: parameters).responseData(
queue: processingQueue,
completionHandler:
{ …Run Code Online (Sandbox Code Playgroud)