How to run synchronically two functions with async operations on iOS using Swift

前端 未结 3 1820
庸人自扰
庸人自扰 2021-02-03 13:12

lets propose this scenario

a method with async network operations

func asyncMethodA() -> String?
{
   result : String?
   Alamofire.manager.request(.P         


        
3条回答
  •  醉梦人生
    2021-02-03 13:26

    Thanks Yimin for the code above. I've updated it to the latest Swift syntax so just posting to be helpful:

    func anAsyncMethod(resultHandler: (_ result: AnyObject) -> Void) {
        ...
    }
    
    func anotherAsyncMethod(resultHandler: (_ result: AnyObject) -> Void) {
        ...
    }
    
    func performWithCompletionHandler(completion: @escaping (AnyObject?, AnyObject?) -> Void) {
    
        let operationQueue = OperationQueue()
    
        var resultOfOperation1: AnyObject?
        var resultOfOperation2: AnyObject?
    
        let operation1 = BlockOperation {
            let dispatchGroup = DispatchGroup()
            dispatchGroup.enter()
            self.anAsyncMethod {
                result in
                resultOfOperation1 = result
                dispatchGroup.leave()
            }
            // wait until anAsyncMethod is completed
            dispatchGroup.wait(timeout: DispatchTime.distantFuture)
        }
    
        let operation2 = BlockOperation {
            let dispatchGroup = DispatchGroup()
            dispatchGroup.enter()
            self.anotherAsyncMethod {
                result in
                resultOfOperation2 = result
                dispatchGroup.leave()
            }
            // wait until anotherAsyncMethod is completed
            dispatchGroup.wait(timeout: DispatchTime.distantFuture)
        }
    
        let completionOperation = BlockOperation {
            // send all results to completion callback
            completion(resultOfOperation1, resultOfOperation2)
        }
    
        // configuring interoperation dependencies
        operation2.addDependency(operation1)
        completionOperation.addDependency(operation2)
    
        operationQueue.addOperations([operation1, operation2, completionOperation], waitUntilFinished: false)
    }
    

提交回复
热议问题