在一个函数之后使用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)
答案 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。它让我觉得它是一个相当戏剧性的解决方案(引入一个全新的异步模式),但它确实很好地解决了这类问题。