How is it possible to perform multiple Alamofire requests that are finished one after another?

前端 未结 1 2005
执念已碎
执念已碎 2021-01-25 01:18

I would like to perform multiple Alamofire requests. However, because of data dependency a new request should only start when the previous is finished.

I already asked

相关标签:
1条回答
  • 2021-01-25 01:43

    The issue is just the same as in the related question you posed: the operation dependencies are on finishing an operation, as documented, but you have written code where the operation exits after asynchronously dispatching a request for future execution (the operations you created and added to a queue will finish in the order set by their dependencies, but the requests will be fired concurrently by the NSURLSession underlying Alamofire).

    If you need serial execution, you can for instance do the following:

    // you should create an operation queue, not use OperationQueue.main here –
    // synchronous network IO that would end up waiting on main queue is a real bad idea.
    let operationQueue = OperationQueue()
    let timeout:TimeInterval = 30.0
    
    for operationNumber in 0..<4 {
        let operation = BlockOperation {
            let s = DispatchSemaphore(value: 0)
            self.performAlamofireRequest(operationNumber) { number in
                // do stuff with the response.
                s.signal()
            }
    
            // the timeout here is really an extra safety measure – the request itself should time out and end up firing the completion handler.
            s.wait(timeout: DispatchTime(DispatchTime.now, Int64(timeout * Double(NSEC_PER_SEC))))
        }
    
        operationQueue.addOperation(operation)
    }
    

    Various other solutions are discussed in connection to this question, arguably a duplicate. There's also Alamofire-Synchronous.

    0 讨论(0)
提交回复
热议问题