2

我对 Vapor 和服务器端 swift 非常陌生,具有 iOS 开发背景(开发应用程序 6 年)。我正在尝试为设备管理构建一个简单的 API,其中包括一个“作业”(您想调用它的计时器),它每隔一小时左右检查一次设备最后一次“签入”。

为此,我设置了 Jobs 包,但是我正在努力弄清楚如何访问服务 ( Ferno ) 以访问我的 Firebase 实时数据库以获取有关设备上次登录时间的信息。似乎根据文档您需要一个实现者Container来创建/访问 aService但似乎没有任何类型的全局容器我可以使用。

我应该尝试创建自己的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"])
}
4

2 回答 2

2

要执行计划任务,最好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并不真正需要 a Request,而是 a Worker。不幸的是,该库明确声明Request,因此您需要使用此解决方法。如果我在这里没有遗漏任何内容,您可以进行 PRFerno并替换Request为。Worker然后你可以这样称呼它:

client.ferno.retrieve(worker: app, queryItems: [], appendedPath: ["devices"])
于 2019-02-20T09:35:07.683 回答
1

我也和费尔诺斗争过。

在 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)
于 2019-02-19T22:14:30.427 回答