首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Swift中暂停后台线程

如何在Swift中暂停后台线程
EN

Stack Overflow用户
提问于 2019-04-09 02:47:47
回答 1查看 755关注 0票数 -2

在我的Swift代码中,我有一个在辅助线程上运行的进程。其中有一个递归方法,我想每隔一段时间暂停一次或更短的时间。我希望我可以只说睡眠(0.5),但当然这太容易了。顺便说一句,任何想告诉我暂停不好的人都不用费心了。我意识到了各种问题。

该过程由DispatchQueue.global(qos: .utility).async { }启动

它对一些在DispatchQueue.main.async { }中完成的UI调用进行回调

有没有人有一个很好的小方法来在代码中的特定点挂起和恢复线程,比如:

代码语言:javascript
复制
func myMethod() {
    for n in 1...100 {
        do some stuff
        callback(parameters)
        based on some logic possibly Thread.pause
        recursively call myMethod()
    } 
}

我的递归工作得很好,但我只是想偶尔放慢它的速度。我假设通过一些重构,我可以达到同样的效果,但是只需插入一个快速的小内联暂停将是如此简单。

EN

回答 1

Stack Overflow用户

发布于 2019-04-11 03:01:42

我要感谢Rob实际上回答了我的问题,他说要使用Thread.sleep。我试过了,但一开始似乎不起作用。然而,正如我告诉他的那样,我一直在尝试,最终我成功了。我不确定到底是“逗号”还是“句号”起了作用,因为我尝试了太多的变体。归根结底,我使用usleep在暂停时获得更好的分辨率,因为sleep必须是整数秒,而我希望小于1秒。尽管有关于首先使用暂停或从for循环内部进行递归的警告,但以下代码完全按照需要工作:

视图控制器

代码语言:javascript
复制
    object.callback = { () -> () in
        DispatchQueue.main.async {
            self.otherView.setSomeUI()
        }
    }


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

对象

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55579921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档