首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将参数传递给通过asyncafter执行的代码

将参数传递给通过asyncafter执行的代码
EN

Stack Overflow用户
提问于 2020-11-20 15:53:09
回答 1查看 41关注 0票数 1

所以我试着在延迟后执行多行代码。grand中央调度中的Asyncafter似乎没有提供一种将信息传递给要执行的代码的方法。例如,我想在0.1秒后执行func(1),在0.2秒后执行func(2),在0.3秒后执行func(3),我该怎么做?

EN

回答 1

Stack Overflow用户

发布于 2020-11-22 01:28:06

你不需要“传递”信息。闭包将自动地“从周围的上下文中常量和变量”:

代码语言:javascript
运行
复制
for i in 0 ..< 1000 {
    DispatchQueue.main.asyncAfter(deadline: .now() + Double(i) / 10) {
        self.func(i)
    }
}

也许你只是以此为例,值得注意的是,如果你想在某个固定的时间间隔做一些事情,asyncAfter有一些缺点:

  1. 如果您可能需要取消此过程(例如,可能有问题的视图已被取消),则取消使用asyncAfter调度的多个单独调度的块将变得有点麻烦和笨拙。

  1. 当您在将来调度多个块时,asyncAfter会受到“定时器合并”的影响,即调度的块彼此相差不到10%时,将同时开始触发。(这是一项省电功能。)

因此,如果您希望计划在某个固定时间间隔触发某些事件,我们将使用重复计时器:

代码语言:javascript
运行
复制
var i = 0
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { [weak self] timer in
    guard let self = self, i < 1000 else {
        timer.invalidate()
        return
    }
    
    self.func(i)

    i += 1
}

但是,同样,我们不必将变量“传递”给Timer闭包。我们可以直接在闭包中使用该变量。

但是,如果您真的只调度了三个调用,分别为0.1、0.2和0.3秒,那么asyncAfter就没问题。但是,如果您计划添加大量此类调用(取消和/或计时器合并成为一个问题),那么可以考虑使用Timer

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64925689

复制
相关文章

相似问题

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