如何在Swift中暂停后台线程

时间:2019-04-08 18:47:47

标签: swift multithreading

在我的Swift代码中,我有一个正在辅助线程上运行的进程。在其中有一个递归方法,我想每隔一秒或更短时间暂停一次。我希望我只能说sleep(0.5),但是那太容易了。顺便说一句,任何想告诉我暂停的人都不必费心。我知道各种问题。

此过程从DispatchQueue.global(qos: .utility).async { }开始

它会回调在DispatchQueue.main.async { }中完成的某些UI调用

有人在代码中的特定位置挂起和恢复线程吗?

func myMethod() {
    for n in 1...100 {
        do some stuff
        callback(parameters)
        based on some logic possibly Thread.pause
        recursively call myMethod()
    } 
}

我的递归效果很好,但我只是偶尔想放慢一点。我认为通过一些重构,我可以达到同样的效果,但是插入一个快速的内联暂停会非常简单。

1 个答案:

答案 0 :(得分:0)

我想称赞Rob通过说使用Thread.sleep来回答我的问题。我试过了,但是起初似乎没有用。但是,正如我告诉他的那样,我不断尝试,最终使它起作用。不确定到底是哪个“逗号”或“句号”真正起作用了,因为我尝试了很多变体。底线是我使用usleep来获得更好的暂停分辨率,因为sleep必须是整数秒,而我希望不到一秒钟。尽管警告过使用暂停或从for循环内部重新开始,但以下代码仍可根据需要正常工作:

视图控制器

    object.callback = { () -> () in
        DispatchQueue.main.async {
            self.otherView.setSomeUI()
        }
    }


    DispatchQueue.global(qos: .background).async() {
        if self.object.method() { print("done") }
        else { print("error") }
    }

对象

private func method() -> Bool
{
    if conditionA { return true } // done
    if conditionB {
        if method() { return true }
    } else {
        for n in 1...N {
            if test() {
                self.callback?() 
                usleep(x) 
                if self.method() {
                    return true
                } else {
                    self.callback?() 
                }
            }
        }
    }
    return false
}