【发布时间】:2017-02-27 11:58:35
【问题描述】:
我正在开发一个应用程序,其中我尝试调试的 403 禁止错误实际上是由每分钟可以向端点发出的请求数量的上限引起的(我真傻)。
很好,我决定将我的网络请求放到 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() 函数来修复它,但我很好奇它在使用 GCD 的 Swift 中如何工作。
谢谢!
编辑:专门寻找具有功能的正确方法,其中单个线程执行每个请求,以便线程被阻塞,直到前一个线程完成,中间有 4 秒的延迟。
【问题讨论】:
标签: ios swift multithreading grand-central-dispatch