一段时间以来,我一直在努力实现这一目标,但无法让它发挥作用。
首先让我展示一个简单的示例代码:
override func viewDidLoad()
{
super.viewDidLoad()
methodOne("some url bring")
}
func methodOne(urlString1: String)
{
let targetURL = NSURL(string: urlString1)
let task = NSURLSession.sharedSession().dataTaskWithURL(targetURL!) {(data, response, error) in
// DO STUFF
j = some value
print("Inside Async1")
for k in j...someArray.count - 1
{
print("k = \(k)")
print("Calling Async2")
self.methodTwo("some url string")
}
}
task.resume()
}
func methodTwo(urlString2: String)
{
let targetURL = NSURL(string: urlString2)
let task = NSURLSession.sharedSession().dataTaskWithURL(targetURL!) {(data, response, error) in
// DO STUFF
print("inside Async2")
}
task.resume()
}
我基本上做的是在我的 methodOne
中执行一个异步请求,在该函数中,我调用我的 methodTwo
来执行另一个异步请求。
我遇到的问题是,当 methodTwo
被调用时,它永远不会进入异步 session 。然而,它确实在 methodTwo
中进入异步 session ,但只有一次 k = someArray.count - 1
。它基本上是排队到最后,这不是我想要实现的。
这是一个示例输出:
Inside Async1
k = 0
Calling Async2
Inside Async1
k = 0
Calling Async2
k = 1
Calling Async2
Inside Async1
k = 0
Calling Async2
k = 1
Calling Async2
k = 2
Calling Async2
Inside Async1
.....
Inside Async1
k = 0
Calling Async2
k = 1
Calling Async2
k = 2
Calling Async2
k = 3
Calling Async2
k = 4
Inside Async2
换句话说,我希望在 methodOne
的异步请求完成之前,在每次迭代中完成来自 methodTwo
的异步请求。
这是我的目标的示例输出:
Inside Async1
k = 0
Calling Async2
Inside Async2
Inside Async1
k = 1
Calling Async2
Inside Async2
Inside Async1
...
我在这里找到了类似的东西:Wait until first async function is completed then execute the second async function
但是,我无法将其与建议和解决方案一起使用。
有人能指出我正确的方向吗?
谢谢
最佳答案
实现此目的的一种方法是更改 methodTwo()
以接受回调作为参数,然后您可以使用信号量:
func methodOne(urlString1: String) {
let targetURL = NSURL(string: urlString1)
let task = NSURLSession.sharedSession().dataTaskWithURL(targetURL!) { data, response, error in
let queue = dispatch_queue_create("org.myorg.myqueue", nil)
dispatch_async(queue) {
// DO STUFF
j = some value
print("Inside Async1")
for k in j...someArray.count - 1 {
print("k = \(k)")
print("Calling Async2")
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
self.methodTwo("some url string") {
dispatch_semaphore_signal(sem);
}
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
}
}
}
task.resume()
}
func methodTwo(urlString2: String, callback: (() -> ())) {
let targetURL = NSURL(string: urlString2)
let task = NSURLSession.sharedSession().dataTaskWithURL(targetURL!) { data, response, error in
// DO STUFF
print("inside Async2")
callback()
}
task.resume()
}
请注意,为了不阻塞 methodOne 任务回调的委托(delegate)队列,该示例创建了自己的队列,您可以随意阻塞。
关于ios - 如何在 Swift 完成外部异步请求之前先完成内部异步请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37201735/