如何在不使用 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 内的程序执行的主要内容,如果未能解决你的问题,请参考以下文章

如何在不阻止UI的情况下暂停指定时间的Java? [重复]

如何在不使用 sleep() 的情况下使用 ontimer 函数延迟进程?

如何在不使用 time.Sleep 的情况下等待所有 goroutines 完成?

如何在不删除的情况下暂停 azure webjob?

如何在不阻塞 UI 的情况下暂停 Java 指定时间? [复制]

在不停止整个程序的情况下休眠 Lua 脚本?