当应用程序将要关闭时,我想从实时数据库中删除一些数据。
我定义了这样的函数(稍后将向其添加逻辑):
exports.removeAllAssignedTeams = functions.https.onCall((data, context) => {
const judgeId = data.judgeId;
console.log("Will unassign all teams assigned to judge id: ", judgeId);
});
我正在从我的应用程序代表处调用它:
func applicationWillTerminate(_ application: UIApplication) {
print("Application will terminate")
functions.httpsCallable("removeAllAssignedTeams").call(["judgeId": getUserPhoneNumber()]) { (_, _) in }
}
但是在我的云功能控制台中,我从未看到任何有关此功能的日志,甚至没有任何迹象表明该功能已开始执行。我在做什么错了?
答案 0 :(得分:1)
我怀疑您没有做错任何事情。在请求真正到达函数之前,应用程序终止的可能性更大。根据{{3}}:
您实现此方法大约需要五秒钟 执行任何任务并返回。如果该方法之前未返回 时间到期,系统可能会完全终止该进程。
我建议在applicationWillTerminate之外测试您的代码,以查看其是否按您期望的方式工作。如果是这样,那么您可以假设在该过程终止之前,该函数的调用尚未及时完成。
还要记住,调用可调用函数是异步的,call()
将在收到结果之前立即返回。因此,您的实现将立即返回,这很可能向iOS发出信号,表明您已完成工作。即使您设法在调用完成之前阻止实现,也可能在大约5秒钟用完之前就无法完成。
答案 1 :(得分:0)
如果要在用户断开连接时从实时数据库中删除数据,请考虑using an onDisconnect
handler。使用这种处理程序,服务器将在检测到客户端消失时删除数据。这可能需要几分钟(取决于应用程序的关闭方式),但通常比在应用程序关闭时尝试进行任何网络调用更为可靠,因为当您执行操作时,相关指示会立即发送到服务器致电onDisconnect
。
如果您使用的是onDisconnect
处理程序,那么您在applicationWillTerminate
中可以做什么 是通过告诉{{3 }}。尽管这也有可能不起作用,但在那种情况下,服务器仍会在几分钟后检测到客户端已消失,而在脱机呼叫通过的情况下,onDisconnect
处理程序将立即执行。
如果删除数据的代码很复杂,请考虑使用onDisconnect
处理程序删除数据库中的简单值。然后,通过将Cloud Function附加到该简单值的去除上,当服务器检测到客户端消失时,Cloud Functions代码将运行。