我正在开发一个应用程序,调试时遇到了403禁止错误,实际上是由于每分钟对端点的请求量有一个上限导致的(我太傻了)。
好的,我决定将我的网络请求放在DispatchQueue上(这样设计更好并发),并使用asyncAfter(deadline:execute:)函数在每个请求之间造成4秒的延迟。
我的程序设计是列表中的每个项目调用一个函数,在该函数内部将一些工作(即请求)放入该调度队列中。请参见下文:
我认为的实现方式是,无论函数是否被不同的线程并发调用,在 asyncAfter(deadline:execute:) 方法中的代码都会被排队,下一个闭包将不会开始执行,直到上一个闭包完成并且另外4秒钟时间已过。
然而,这种方法没有奏效-- print(Date()) 打印的时间之间没有延迟。
我通过使用unix中的sleep()函数来解决了这个问题,但我很想知道如何在Swift中使用GCD来实现。
谢谢!
注:具体来说,我正在寻找一种正确的功能方式,使得单个线程执行每个请求,以便该线程在前一个请求完成后被阻塞,并且在两个请求之间有4秒的延迟。
好的,我决定将我的网络请求放在DispatchQueue上(这样设计更好并发),并使用asyncAfter(deadline:execute:)函数在每个请求之间造成4秒的延迟。
我的程序设计是列表中的每个项目调用一个函数,在该函数内部将一些工作(即请求)放入该调度队列中。请参见下文:
class ViewController
let serialQueue = DispatchQueue(label: "networkRequests")
func myFirstFunc {
for item in items {
self.mySecondFunc(item: item, completionHandler: {(completionItem) in
// you shouldn't need this
})
}
}
func mySecondFunc(item: someType, completionHandler: @escaping (String?) -> Void) {
let task = session.dataTask(with: request, completionHandler: {(data, response, error) in
// stuff
completionHandler(changedItem)
})
self.serialQueue.asyncAfter(deadline: .now() + 4.0) {
task.resume()
print(Date())
}
}
}
}
我认为的实现方式是,无论函数是否被不同的线程并发调用,在 asyncAfter(deadline:execute:) 方法中的代码都会被排队,下一个闭包将不会开始执行,直到上一个闭包完成并且另外4秒钟时间已过。
然而,这种方法没有奏效-- print(Date()) 打印的时间之间没有延迟。
我通过使用unix中的sleep()函数来解决了这个问题,但我很想知道如何在Swift中使用GCD来实现。
谢谢!
注:具体来说,我正在寻找一种正确的功能方式,使得单个线程执行每个请求,以便该线程在前一个请求完成后被阻塞,并且在两个请求之间有4秒的延迟。
Thread.sleep
会阻塞当前线程。我建议改用DispatchQueue.global().asyncAfter(wallDeadline: DispatchWallTime.now() + 4.0) { self.group.leave() }
。 - Stuart Malone