【问题标题】:How to make synchronous operation with asynchronous callback?如何使用异步回调进行同步操作?
【发布时间】: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?
  • 请求是相互依赖还是可以并发执行?在前一种情况下,您最终将它们“嵌套”在下一个请求可能需要前一个请求的结果的地方。这也意味着异步任务是按顺序执行的。否则,如果请求是独立的,请同时运行它们并在所有请求完成后继续。您需要的方法取决于此决定。

标签: ios swift


【解决方案1】:

改用DispatchQueue 对我有用。

class MyClass {
    static let shared = MyClass()
    let dispatchQueue = DispatchQueue(label: "ALAMOFIRE_REQUEST")
    let dispatchGroup  = DispatchGroup()

    func request(_ myRequestURL: URL) {
        dispatchQueue.async {
            self.dispatchGroup.enter()
            // Async function
            Alamofire.request(myRequestURL).response { response in
                print(response.request)
                self.dispatchGroup.leave()
            }

            self.dispatchGroup.wait(timeout: .distantFuture)
        }
    }
}

【讨论】:

  • 很棒的解决方案!谢谢!
  • 是否可以返回值?
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多