ios - 等到多个请求被执行并且它们的完成 block

标签 ios swift alamofire grand-central-dispatch nsurlrequest

考虑一个场景,我有一个函数“REFRESH”,这个函数被不同的方法同时调用,假设方法是“A”、“B”、“C”。如果方法“A”首先调用“REFRESH TOKEN”,那么方法“B”和“C”应该等到它完成。

我怎样才能实现这种情况?感谢您的帮助!

let serialQueue = DispatchQueue(label: "serialQueue")
var myFlag = false


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.refresh(param: 1) // Method A
    self.refresh(param: 2) // Method B
    self.refresh(param: 3) // Method C

}

// Method REFRESH

func refresh(param: NSInteger) -> Void {

let absolutePath = "MY SAMPLE API"
var headers: [String: String] = Dictionary<String, String>();
headers["Content-Type"] = "application/json"


serialQueue.sync {
    print("\nEntered ", param)
Alamofire.request(absolutePath, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseString {
    response in
    switch response.result {
    case .success:
        print("SUCCESS")
        break
    case .failure(let error):
        print(error)
    }

}

以上代码输出:

Entered  1
Entered  2
Entered  3
SUCCESS
SUCCESS
SUCCESS

我需要这样的输出:

Entered  1
SUCCESS
Entered  2
SUCCESS
Entered  3
SUCCESS

最佳答案

您需要的是称为资源锁定 的东西。您可以使用 DispatchGroup 实现这一点。

首先您需要创建一个DispatchGroup。在您的 Controller 中添加一个属性:

let dispatchGroup = DispatchGroup()

然后将您的refresh(param:) 函数修改为:(我已经修改了一些编码模式)

func refresh(param: NSInteger) -> Void {
    // You lock your resource by entering to the dispatch group
    dispatchGroup.enter()
    let absolutePath = "MY SAMPLE API"
    var headers = [String: String]()
    headers["Content-Type"] = "application/json"
    print("Entered \(param)")
    Alamofire.request(absolutePath, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseString { [weak self] (response) in
        switch response.result {
        case .success:
            print("SUCCESS \(param)")
            break
        case .failure(let error):
            print(error)
        }
        // You release the resource as soon as you get the response so that other processes may be able to use the resource
        self?.dispatchGroup.leave()
    }
    // The lock continues by invoking the wait method
    dispatchGroup.wait()
}

因此,这将用作:

方法 1方法 2 请求使用相同的资源。当Method 1 正在执行时,Method 2 将等待Method 1 完成。 Method 1 完成后,Method 2 将有机会开始执行。

所以,基本上哪个方法先开始执行就会结束,然后另一个就会开始。虽然不能保证哪个会先开始执行(因为,你们不需要相互依赖)。但这将取决于您调用此方法的顺序。

关于ios - 等到多个请求被执行并且它们的完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49272688/

相关文章:

ios - 从上到下方向呈现 View Controller

ios - Alamofire 不显示所有 cookie

ios - Alamofire 的 Swift 扩展方法返回 SwiftyJSON 结果

node.js - Cloud Function HTTP 请求参数在 "&"处拆分

ios - iOS项目的.git文件夹

ios - Xcode 7 中没有类型或协议(protocol)命名错误如何解决?

ios - PubNub 防止存在超时

ios - UIViewController 动画停止工作

ios - UICollectionView 在 swift 2 中滚动时更改单元格数据

ios - 搜索 firebase 数据 : iOS, Swift