Alamofire多任务执行一个函数后执行

时间:2016-07-14 06:35:19

标签: ios grand-central-dispatch alamofire operation

在一个函数之后使用Alamofire多任务执行。 我使用gcd,NSOperationQueue都失败了。 请帮我解决一下。

以下伪代码:

let imgDatas1 = UIImageJPEGRepresentation(UIImage(named: "aar")!, 0.1)
let strUrl1 = "http://www.baidu.com"


    let group = dispatch_group_create()
    let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    //let queue = dispatch_get_main_queue()

    dispatch_group_async(group, queue) {
        print("threed 1.1")
        Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in
            NSThread.sleepForTimeInterval(3.0)
            print("threed1.3")
        })
        print("threed1.2")
    }
    dispatch_group_async(group, queue) {
        print("threed2.1")
        Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in
            NSThread.sleepForTimeInterval(2.0)
            print("threed2.3")
        })

        print("threed2.2")
    }

    dispatch_group_notify(group, queue) {
        print("voer")
    }





    let operationQueue = NSOperationQueue()
    let operation1 = NSBlockOperation {
        Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in
            NSThread.sleepForTimeInterval(2.0)
            print("xian 1.2")
        })
        print("xian 1.1")

    }
    let operation2 = NSBlockOperation {
        Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in
            NSThread.sleepForTimeInterval(3.0)
            print("xian 2.2")
        })
        print("xian 2.1")
    }
    let operation3 = NSBlockOperation {
        print("xian 3")
    }
    operation2.addDependency(operation1)
    operation3.addDependency(operation2)

    operationQueue.addOperation(operation1)
    operationQueue.addOperation(operation2)
    operationQueue.addOperation(operation3)

1 个答案:

答案 0 :(得分:0)

这两种方法的问题在于您正在同步发出请求,而不是请求的实际响应。在您的GCD示例中,您会在请求发出后立即退出before[b_counter] = '\0'; word[word_counter] = '\0'; after[a_counter] = '\0'; ,但尚未收到回复。同样在您的操作队列示例中,您在发出请求后立即完成阻止操作,但这些操作不会等待请求完成。

简单的,如果不优雅的方法是在前一个的完成处理程序中调用一个。如果将它们放在单独的函数中,则可以避免完成处理程序的不合时宜的嵌套。

如果您正在寻找更优雅的解决方案,可以通过将其包装在异步dispatch_group_async / NSOperation子类中来解决此操作队列,并且仅在触发Operation KVO时触发isFinished KVO请求已完成。请参阅Operation Reference中的异步与同步操作部分,或并发编程指南中Operation Queues: Concurrent Versus Non-concurrent Operations中稍微更详细(但已注明日期)的讨论。

另一种优雅的方法是使用承诺,例如PromiseKit。它让我觉得它是一个相当戏剧性的解决方案(引入一个全新的异步模式),但它确实很好地解决了这类问题。