API请求队列的最佳实践

时间:2016-05-04 03:06:37

标签: ios swift api optimistic-locking

Swift制作API请求队列的最佳做法是什么?我的意思是,虽然在函数上调用了多个API,但如何确保第一个API首先获得任何响应然后执行第二个API?

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

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

    })
}

...

我正在考虑给出一个标志,指示还有其他任何API仍在等待响应,因此将要执行的第二个API将等待,直到先前调用的API更改了该标志。但是,还有其他更好的选择吗?感谢。

2 个答案:

答案 0 :(得分:1)

正如@ 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
});

答案 1 :(得分:1)

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

使用通用Success类型

创建枚举
enum Result<T> : ErrorType {
  case Success(T)
  case Failure(NSError)
}

getAPI1成功返回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参数,并在成功时返回字典[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)
    }
  }
}