如何在不使用 sleep() 的情况下暂停 DispatchQueue 内的程序执行
Posted
技术标签:
【中文标题】如何在不使用 sleep() 的情况下暂停 DispatchQueue 内的程序执行【英文标题】:How to pause programmatic execution inside a DispatchQueue without using sleep() 【发布时间】:2021-11-25 09:10:14 【问题描述】:所以我向服务器发出了一个 post 请求。在响应中,我在主线程中运行一些代码并有条件地调用另一个发布请求。我的问题是——我需要等待约 5 秒才能处理条件。不使用 sleep() 怎么办? (使用 sleep 会冻结我的应用)。
func getStuff()
let server = appState.server + "extension"
let package = self.myID
guard let url = URL(string: server) else return
var urlRequest = URLRequest(url: url)
urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")
urlRequest.httpMethod = "POST"
guard let data = try? JSONEncoder().encode(package) else return
urlRequest.httpBody = data
let task = URLSession.shared.dataTask(with: urlRequest)
(data, response, error) in
if let error = error
return
guard let data = data else return
guard let dataString = String(data: data, encoding: String.Encoding.utf8) else return
let jsonData = Data(dataString.utf8)
var decodedJob: Job? = nil
do
decodedJob = try JSONDecoder().decode(Formatter.self, from: jsonData)
catch
print(error.localizedDescription)
DispatchQueue.main.async
self.firstTimeLoading = false
sleep(5) //how do I replicate this behavior without freezing the app?
if array == []
otherPostFunction()
task.resume()
【问题讨论】:
使用睡眠?它对您的应用有什么好处? 不要问sleep()
能为你做什么。询问您可以为异步过程做些什么。
@ElTomato sleep 冻结应用程序的时间,我只需要某种程序延迟。我正在考虑在这个外部 DispatchQueue 中使用 DispatchQueue.main.asyncAfter,但这不起作用——不知道如何继续。
我已经为您的需要提出了建议。我会问谷歌,雅虎!或者如果我是你的话。
@ElTomato 你的意思是使用异步/等待?我不能这样做,因为我不在 Swift 5.5 中工作。
【参考方案1】:
执行以下操作:
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(5)) [weak self] in
if self?.array ?? [] == []
self?.otherPostFunction()
【讨论】:
以上是关于如何在不使用 sleep() 的情况下暂停 DispatchQueue 内的程序执行的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 sleep() 的情况下使用 ontimer 函数延迟进程?
如何在不使用 time.Sleep 的情况下等待所有 goroutines 完成?