【问题标题】:Multiple timers in a loop循环中的多个计时器
【发布时间】:2017-07-04 13:49:47
【问题描述】:

我有一个字符数组,例如。

["A","E","I","O","U","Y"]

我应该循环这个数组,并为每个字符启动一个计时器。即:如果当前字母为A,则必须打印A并持续2秒。打印完 A 后,我们需要打印“E”,它应该持续 3 秒,“I”一秒,“O”四秒,等等。

我认为我应该为每个角色创建一个新的计时器,这样:

Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: 
#selector(printCharacter), userInfo: nil, repeats: false)

但我不能在循环内这样做。

我希望有一种方法可以构建一组计时器,然后按顺序触发它们,但这是不可能的。有什么想法吗?

【问题讨论】:

    标签: arrays swift loops timer


    【解决方案1】:

    您只能使用递归和DispatchQueue 来实现此目的。如果您不熟悉递归,可以通过googling it 了解它的简单方法

    如果打印持续时间不是线性的,示例代码如下所示:

    var currentIndex = 0
    let charactersArray = ["A","B","C","D"]
    let durations : [TimeInterval] = [1.0,2.0,3.0,4.0]
    
    func printCharacter(){
    
        guard currentIndex < charactersArray.count else { return }
    
        print(charactersArray[currentIndex])
    
        DispatchQueue.main.asyncAfter(deadline: .now() + durations[currentIndex], execute: {
    
            currentIndex = currentIndex + 1
    
            printCharacter()
        })
    }
    
    printCharacter()
    

    其中 durations 数组表示每个字符显示的时间

    【讨论】:

    • 我也熟悉递归和队列 :-) 谢谢,您的解决方案比我尝试的上一个解决方案好得多
    • 只是代码中的一个小错字(持续时间应该是带有 final s 的持续时间)。 TimeInterval 应该是 Double (对吗?)
    • @3000 至于缺少的 s 你是完全正确的。 TimeInterval 是 Double 的别名,用于在处理计时时使代码更具可读性
    • 好吧,我不得不想象 typealias,抱歉 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多