我是Vapor和服务器端swift的新手,具有iOS开发背景(开发应用程序6年)。我正在尝试为设备管理构建一个简单的API,其中包括一个“作业”(Timer,无论你想叫它什么),它会在最后一次检查设备“Checked In”时每小时检查一次。
为此,我设置了Jobs包,但是我正在努力弄清楚如何访问服务(Ferno)来点击我的Firebase实时数据库以获取有关设备上次登录的信息。似乎根据docs你需要一个Container
的实现者来创建/访问Service
,但似乎没有任何类型的全局容器我可以使用。
我是否应该尝试创建自己的Request
才能访问Ferno
服务?或者有没有办法可以访问全球app
?
以下是我到目前为止所做的,但我所做的似乎非常错!当然必须有办法实现这一目标吗?
Jobs.add(interval: (60*30).seconds) { [weak devicesController] in
devicesController?.checkForNotSeenDevices()
}
func checkForNotSeenDevices() throws {
let client = try app(.detect()).make(FernoClient.self)
client.ferno.retrieve(req: ???, queryItems: [], appendedPath: ["devices"])
}
我也和Ferno一直在挣扎。
在boot.swift内部,使用全局应用程序作为ferno客户端和请求的容器。
let client = try! app.make(FernoClient.self)
let request = Request(using: app)
现在您的客户端已准备好进行数据库操作,例如后期操作。每次使用您自己的作业时都可以重复。
let inputData = try! client.ferno.overwrite(req: request, appendedPath: ["users/john"], body: yourOwnContentModel)
要做预定的任务,最好在scheduleRepeatedTask
上使用EventLoop
。你可以,例如在你的boot.swift
中调用这个:
app.eventLoop.scheduleRepeatedTask(initialDelay: .seconds(0), delay: .minutes(30)) { _ in
let client = try app.make(FernoClient.self)
let request = Request(using: app)
client.ferno.retrieve(req: request, queryItems: [], appendedPath: ["devices"])
}
实际上FernoClient().client.retrieve
并不真正需要Request
,而是Worker
。不幸的是,该库明确声明了Request
,所以你需要这个解决方法。你可以向Ferno
做一个公关,用Request
取代Worker
,如果我在这里没有错过的话。然后你可以像这样调用它:
client.ferno.retrieve(worker: app, queryItems: [], appendedPath: ["devices"])