Swift4:延迟...循环结果

Swift4: Delay for...loop results

我有一个应用程序可以随机抽取名字,然后以 3 或 4 个为一组显示它们。 一切都很好,但我想延迟输出(增加悬念) 我们目前得到 "Group 1 consists of Fred, Dave, Steve, John"

我们想看"Group 1 consists of .(pause).....Fred...(pause)......Dave..(pause)......Steve....(pause).....John"

我已经试过了Sleep(x),但这似乎被忽略了。

这是我的简单循环:

玩家存储在数组playing中。 G1 可以是 1 到 4 之间的任何值。 Gr1Text 是一个文本框。

for i in 0...G1-1 {
    G1Text = (G1Text ?? "") + playing[i] + " , "
    self.Gr1Text.text = G1Text}
}

只需要在显示名称之间暂停一下

谢谢

所以我创建了一些代码来使用动画删除名称

func dropText(_ sender: String)
{
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.text = sender
    label.font = UIFont.systemFont(ofSize: 32, weight: .bold)
    label.textColor = UIColor.white
    view.addSubview(label)

    var yAnchor = label.centerYAnchor.constraint(equalTo: view.topAnchor, constant: -200)
    yAnchor.isActive = true

    label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
        yAnchor.isActive = false
        yAnchor = label.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: 200)
        yAnchor.isActive = true
        UIView.animate(withDuration: 1, delay: 1, usingSpringWithDamping: 0.5, initialSpringVelocity:5, options: .curveEaseIn, animations: {

            self.view.layoutIfNeeded()
        })
}

但我还是不知道如何在名字之间停顿。如果我使用 for .. 循环来调用此函数,它只会同时运行它们吗?

谢谢

Just need a pause between displaying the names

首先 select 分组可能更容易,然后再考虑如何按您喜欢的方式显示它们。拥有组后,您可以使用计时器来安排每个名称的显示。如果你不想那样做,那么你仍然应该使用一个计时器,只是 select 下一个名称并一步显示它,然后启动另一个计时器 select 并显示下一个,依此类推。

使用循环延迟的 for 循环是一个糟糕的计划,因为这意味着您的程序不能做任何其他事情,至少在那个线程上,直到整个过程完成。应用程序通常在后台进行很多操作,因此以这种方式阻塞主线程是非常糟糕的事情。

Makes sense, but when you say use a timer... what timer method?

任何适合你的。例如,您可以使用 scheduledTimer(withTimeInterval:repeats:block:),并将其设置为每秒重复一次,直到完成。或者你可以让它只触发一次,但在当前定时器触发时启动一个新定时器——这样你就可以使用不同的时间间隔,这样用户就不知道下一个名字出现的确切时间。

另一种方法是使用 Core Animation 并将名字动画显示在屏幕上——它可以是一个单独的长动画,显示所有名字之间有延迟,或者是安排在不同时间的一系列动画。使用动画可以让您以一种有趣的方式显示名称...它们可以淡入,或从屏幕外滑入,或者似乎落在屏幕上并有一点弹跳,等等。

我找到了使用

的解决方案
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {}

这非常适合延迟。

您可以使用相同的标签并修改标签内的文本。对于中间暂停,您可以使用计时器。

func addNamesWithDelay(){
        let friendsName = ["aaa","bbb","ccc","ddd","eee"]
        var nameCnt = 0
        var finalStr = "Group 1 has "
        Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { (timer) in
            let randomNumber = Int.random(in: 0...4) // total 5 players
            if nameCnt == 2 { // assuming one group has 3 players
                timer.invalidate()
            }
            finalStr = finalStr + friendsName[randomNumber] + (nameCnt == 3 ? "" : " ,")
            self.lbl.text = finalStr
            nameCnt += 1
        }
    }