【问题标题】:Timer called during Vapor request never fires在 Vapor 请求期间调用的计时器永远不会触发
【发布时间】:2021-12-01 21:01:20
【问题描述】:

在 Vapor 的请求上下文中创建计时器是否有任何问题?我需要在用户启动流程几分钟后触发一个动作。到目前为止,当我调用执行此操作的例程时,我确认设置计时器的代码已运行。但是计时器和对主 DispatchQueue 的调用都不会触发。 调用设置的方法会立即将用户重定向到另一个端点,我想知道这是否是原因。

func startTournament(req: Request) -> EventLoopFuture<Response> {
    let uId : UUID = req.auth.get(User.self)!.id!
    var tourn : Tournament?
    return User.query(on: req.db)
        .with(\.$tournament)  { $0.with(\.$invitations)}
        .filter(\.$id == uId)
        .first().flatMap { u  in
            tourn = u!.tournament!
            Tournament.addTournamentTimer(tourn!)

是调用设置的代码。

这是调用的方法,执行打印语句:

static func addTournamentTimer(_ tourn : Tournament) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
        print("Timer fired!")
    }
    let timer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) { timer in
        print("Timer fired!")
    }
    print("adding timer for tournament \(tourn.name)")
}

我不想使用 DispatchQueue 方法,但我尝试包含它以查看它是否有效。似乎没有。我对使用计时器还很陌生,但是我有相当多的功能可以在客户端应用程序中使用计时器,所以我很能够在其他地方找到它们。同样,我假设这对我来说是关于异步的不清楚的 请求,或者当重定向发生时计时器被转储?

【问题讨论】:

    标签: swift timer vapor


    【解决方案1】:

    在服务器端设置定时器的正确方法是使用 NIO 而不是 GCD。

    使用eventLoop 并检查其schedule... 方法,以根据您的情况选择合适的方法。

    以下是您使用 NIO 的方法示例:

    static func addTournamentTimer(_ tourn : Tournament, on req: Request) {
        req.eventLoop.scheduleTask(deadline: NIODeadline.now() + .seconds(5)) {
            print("Timer fired!")
        }
        print("adding timer for tournament \(tourn.name)")
    }
    

    【讨论】:

    • 使用此方法,我可以将其分配给我可以 a.) 稍后访问的变量,b.) 替换或修改截止日期吗?在我的使用中,如果发生某些事件,则必须延长初始期限。计时器提供了一种方便的方法来做到这一点……
    • 尝试了这个方法,效果很好。我的新问题是上述评论的扩展:当我通过创建 scheduleTask 获得 Scheduled 对象时,我得到了什么?我需要能够将这些与它们关联的对象的 UUID 一起存储在字典中。存储在 Dictionary 中的对象的类型是什么?
    • 存储对象类型为Scheduled&lt;T&gt;,只有cancel()方法。所以它并没有你想象的那么富有。您还可以查看有关队列的 Vapor 文档docs.vapor.codes/4.0/queues
    • ……我正在学习。感谢您的输入;我已将答案标记为正确,因为它符合原始问题的限制。我认为,我要做的是让计划的事件运行,但在执行时通过存储任何后续更改的字典检查执行操作的截止日期是否已延长。这样,我可以简单地安排一个新事件,并在延迟的时间执行。
    猜你喜欢
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多