如何在Swift3中设置多个Timer

时间:2016-12-27 01:59:25

标签: timer swift3

我试图将一系列上传工作设置到服务器上。我想逐个发送数据包,所以我想设置一个特定的时间间隔作为每个上传作业之间的等待时间。所以我尝试在Timer类中使用静态方法:

db.squad.aggregate([
  {$unwind:"$squad.members"},
  {$match:{"squad.members.empty": true}},
  {$group:{_id:"$_id",count:{$sum:1}}},
  {$match: {count: {$gt: 3}}}
])

目的是在每个定时器触发点之间允许10秒的时间。但问题是仅观察到第一个定时器等待时间为10秒,而后续定时器中的后续作业刚刚在第一个上载任务完成后立即启动,如每个打印作业出现的时间所示。谁能帮我理解为什么会这样?并提出解决问题的建议?

非常感谢!

2 个答案:

答案 0 :(得分:0)

这三个计时器基本上都是在同一时间开始的。为了让它与您显示的内容类似,您必须嵌套定时器,以便定时器n触发定时器n+1,并根据需要嵌套多次。然而,这可能是一个非常笨重的解决方案。

相反,让一个计时器重复会更好。

Timer.scheduledTimer(withTimeInterval: 30.0, repeats: true) { timer in
    let packagesUploaded = (timer.userInfo ?? 0) + 1
    timer.userInfo = packagesUploaded

    print("Uploaded package #\(packagesUploaded)!")

    if packagesUploaded == 10 { timer.invalidate() }
}

答案 1 :(得分:0)

上传是异步的。因此,问题是您没有等待上传完成。您只是完全独立于任何其他现实运行这些计时器。你正在将它们全部设置好然后它们只是在它们到来时才开火。

因此,例如,如果上传需要30秒,第二个和第三个定时器将在第一个上传仍在进行时触发。

如果您想在上传完成后等待十秒钟,则需要在上传的委托方法中启动一个十秒计时器,告知您已完成该计时器。