Alamofire的请求数量接连不断

时间:2016-07-28 08:27:03

标签: swift io alamofire

我有一些请求,我想一个接一个地调用,而没有嵌套的意大利面条代码。

我已经尝试使用串行调度队列

let queue = dispatch_queue_create("label", DISPATCH_QUEUE_SERIAL)

Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in
            print(1)
        }

Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in
            print(2)
        }

Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in
            print(3)
        }

但不幸的是,这不起作用。其输出可以是1,3,2或3,1,2或任何其他组合。

最好的方法是一个接一个地获得输出1,2,3。

3 个答案:

答案 0 :(得分:4)

好的,我最终编写了自己的实现。

我创建了一个以RequestChain作为参数

的课程Alamofire.Request
class RequestChain {
    typealias CompletionHandler = (success:Bool, errorResult:ErrorResult?) -> Void

    struct ErrorResult {
        let request:Request?
        let error:ErrorType?
    }

    private var requests:[Request] = []

    init(requests:[Request]) {
        self.requests = requests
    }

    func start(completionHandler:CompletionHandler) {
        if let request = requests.first {
            request.response(completionHandler: { (_, _, _, error) in
                if error != nil {
                    completionHandler(success: false, errorResult: ErrorResult(request: request, error: error))
                    return
                }
                self.requests.removeFirst()
                self.start(completionHandler)
            })
            request.resume()
        }else {
            completionHandler(success: true, errorResult: nil)
            return
        }

    }
}

我像这样使用它

let r1 = Alamofire.request(Router.Countries).responseArray(keyPath: "endpoints") { (response: Response<[CountryModel],NSError>) in
    print("1")
}

let r2 = Alamofire.request(Router.Countries).responseArray(keyPath: "endpoints") { (response: Response<[CountryModel],NSError>) in
    print("2")
}

let r3 = Alamofire.request(Router.Countries).responseArray(keyPath: "endpoints") { (response: Response<[CountryModel],NSError>) in
    print("3")
}

let chain = RequestChain(requests: [r1,r2,r3])

chain.start { (success, errorResult) in
    if success {
        print("all have been success")
    }else {
        print("failed with error \(errorResult?.error) for request \(errorResult?.request)")
    }


}

重要的是,您要告知经理不立即执行请求

    let manager = Manager.sharedInstance
    manager.startRequestsImmediately = false

希望它会帮助别人

答案 1 :(得分:0)

一旦返回结果,我正在使用Artman's Signals通知我的应用,之后其他地方的队列可以调用它的下一个请求:

Alamofire.request( httpMethod, url, parameters: params ).responseJSON
{
    ( response: Response< AnyObject, NSError > ) in

    self._signals.dispatchSignalFor( Key: url, data: response.result )
}

更多详情here

答案 2 :(得分:-1)

一种解决方案是在第一个回叫中调用第二个请求:

Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in
            print(1)
            Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in
                 print(2)
                 Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in
                      print(3)
                 }
            }
        }