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更改了该标志。但是,还有其他更好的选择吗?感谢。
答案 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)
}
}
}