【问题标题】:Using dispatchQueue in loops在循环中使用 dispatchQueue
【发布时间】:2018-05-01 15:54:35
【问题描述】:

我正在尝试延迟循环某些内容(仅作为概念证明),这是为了其他内容。但为了简化,这里举个例子。

所以在这个例子中,我有一个带有“text”的字符串,我想循环添加另一个字符串让我们说 10 次。唯一的事情是我希望每次迭代都有延迟。到目前为止,这是我的代码。

// 全局变量

var myString = "文本"

// 按钮内的动作

    let delayInSeconds = 1.0
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {

        for _ in 1...10 {
           self.myString += "another text"
        }
    }
    labelOne.text = myString

}

我应该补充一点,结果是立即添加了所有 10 个“另一个文本”,没有任何延迟。

谢谢

【问题讨论】:

    标签: swift loops timer delay dispatch-queue


    【解决方案1】:

    在您的示例中,您在同一个工作单元中附加了十次字符串。尝试在每个循环中分派一次工作:

    for delay in 1...10 {
        let delayInSeconds = Double(delay)
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {
            self.myString += "another text"
            labelOne.text = myString
        }
    }
    

    不过,此循环不适用于任意大的值。它也没有提供我们可能想要的用户界面更改的那种精确时间。为此,我们可以使用Timer。下面是使用 Timer 重新处理的相同问题:

    // Add to the class body…
    var i = 1
    // Lazy initialization so the timer isn’t initialized until we call it
    lazy var timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) {timer in
        guard self.i <= 20 else {
            timer.invalidate()
            return
        }
    
        self.label.text?.append(" another text")
        self.i += 1
    }
    
    // Add to the button action…
    timer.fire()
    

    【讨论】:

    • @AlanKantz 你好 Alan Kantz。您的解决方案有效,但我现在遇到了另一个问题。如果我将范围更改为超过 10,假设为 20。会发生什么情况是它等待 2 秒(是我的延迟的两倍)并一次添加 2 个“另一个文本”。这发生在第 10 次迭代之后。我该如何解决?谢谢
    • @forTheSakeOfLogic 我编辑了解决方案以包含一个替代方案,它对原始代码进行了更彻底的更改,但可以更好地扩展并提供更好的时间准确性。
    • 非常感谢。有效!!!尽管“viewController 没有成员迭代器”,但 self.iterator 给了我一个错误。我删除了该行,代码仍然有效,但字符串的添加不会停止。我想你是想写的。 self.i += 1,修复了总是添加并在 20 处停止。非常感谢!
    【解决方案2】:

    如果我理解正确,您希望每个“文本”都延迟显示文本。 您可以在此处使用递归。

    1.将调度代码移动到方法中。 2.删除for循环。 3. 在 dispatch 它里面做你必要的动作。 4. 在 dispatch 中再次调用相同的方法。

    请记住使用每次调用方法时递增的计数器变量。用它来中断递归。

    【讨论】:

      猜你喜欢
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 2021-06-07
      • 2021-03-24
      • 2018-05-09
      • 2022-08-24
      • 1970-01-01
      相关资源
      最近更新 更多