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

前端 未结 3 1818
庸人自扰
庸人自扰 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)
    }
    
    0 讨论(0)
  • 2021-02-03 13:26

    With the below, you can launch both async methods at the same time and do your heavy lifting after whichever one finishes last.

    var methodAFinished = false
    var methodBFinished = false
    
    func asyncMethodA() -> String?
    {
        Alamofire.manager.request(.POST, "https://www.apiweb.com/apimethod", parameters: parameters, encoding:.JSON)
            .response { (request, response, rawdata, error) in
                if (response?.statusCode == 200) {
                    methodAFinished = true
                    doStuff()
                }
            }
        return result //string
    }
    

    The guts of asyncMethodB would be methodBFinished = true; doStuff()

    func doStuff() {
        if methodAFinished && methodBFinished {
            // do crazy stuff
        }
    }
    
    0 讨论(0)
  • 2021-02-03 13:32
    func anAsyncMethod(resultHandler: (result: AnyObject) -> Void) {
        ...        
    }
    
    func anotherAsyncMethod(resultHandler: (result: AnyObject) -> Void) {
        ... 
    }
    
    let operationQueue = NSOperationQueue()
    
    func performWithCompletionHandler(completion: (AnyObject?, AnyObject?) -> Void) {
            var resultOfOperation1: AnyObject?
            var resultOfOperation2: AnyObject?
    
            let operation1 = NSBlockOperation {
                    let dispatchGroup = dispatch_group_create()
                    dispatch_group_enter(dispatchGroup)
                    self.anAsyncMethod {
                            result in
                            resultOfOperation1 = result
                            dispatch_group_leave(dispatchGroup)
                    }
                    // wait until anAsyncMethod is completed
                    dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER)
            }
    
            let operation2 = NSBlockOperation {
                    let dispatchGroup = dispatch_group_create()
                    dispatch_group_enter(dispatchGroup)
                    self.anotherAsyncMethod {
                            result in
                            resultOfOperation2 = result
                            dispatch_group_leave(dispatchGroup)
                    }
                    // wait until anotherAsyncMethod is completed
                    dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER)
            }
    
            let completionOperation = NSBlockOperation {
                    // 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)
    }
    
    0 讨论(0)
提交回复
热议问题