API 请求队列的最佳实践

Best practice for API Request's Queue

Swift 创建 API 请求队列的最佳做法是什么?我的意思是,虽然在一个函数上调用了超过 1 个 API,但如何确保第一个 API 先得到任何响应然后第二个 API 被执行?

func test() {
    getAPI1()
    getAPI2()
}

func getAPI1() {
    Connector.sharedInstance().getAPI1({ (
        data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in

    })
}

...

我正在考虑给出一个标志来指示还有其他 API 仍在等待响应,因此将要执行的第二个 API 将等到标志被更改以前称为API。但是,还有其他更好的选择吗?谢谢

正如@Paulw11 所说,dispatch_groups 将适用于您的情况

dispatch_group_t myGroup = dispatch_group_create();

dispatch_group_enter(myGroup);
[asyncMethodWithCompletion:^(id *results, NSError* error){
    // process results
    dispatch_group_leave(myGroup);
}];

dispatch_group_notify(myGroup, dispatch_get_main_queue(),^{
    // This will be called when asyncMethodWithCompletion is completed
});

几乎每个 Cocoa API 都是异步工作的,例如

创建具有通用 Success 类型的枚举

enum Result<T> : ErrorType {
  case Success(T)
  case Failure(NSError)
}

getAPI1 returns 一个 NSData 对象成功否则 NSError

func getAPI1(completion:Result<NSData> -> ()) {
  var data : NSData?
  //
  if data != nil {
    completion(.Success(data!))
  } else {
    let error = NSError(domain: "my.domain", code: 9999, userInfo: [:])
    completion(.Failure(error))
  }
}    

getAPI2 有一个 NSData 参数和 returns 一个字典 [String:AnyObject] 对象成功否则 NSError

func getAPI2(data:NSData, completion:Result<[String:AnyObject]> -> ()) {
  //
  completion(.Success([String:AnyObject]()))
}

test 根据结果异步执行这两个方法

func test() {
  getAPI1 { (result1) in
    switch result1 {
    case .Success(let data) :
      getAPI2(data) { (result2) in
        switch result2 {
        case .Success(let dictionary) :
          dispatch_async(dispatch_get_main_queue()) {
            // update UI with the dictionary
          }
        case .Failure(let error) : print(error)
        }
      }

    case .Failure(let error) : print(error)
    }
  }
}