在 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 方法,但我嘗試包含它以查看它是否有效。似乎沒有。我對使用計時器還很陌生,但我有相當多的函式可以在客戶端應用程式中處理計時器,所以我很容易在其他地方找到它們。同樣,我假設這對我來說不清楚關于異步請求,或者當重定向發生時計時器被轉儲?
uj5u.com熱心網友回復:
在服務器端設定計時器的正確方法是使用 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)")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/313645.html
