【问题标题】:How to pause programmatic execution inside a DispatchQueue without using sleep()如何在不使用 sleep() 的情况下暂停 DispatchQueue 内的程序执行
【发布时间】: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 中工作。

标签: ios swift post timer sleep


【解决方案1】:

执行以下操作:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(5)) {[weak self] in
            if self?.array ?? [] == [] {
                self?.otherPostFunction()
            }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多