Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在applicationWillTerminate中调用云函数_Ios_Swift_Firebase_Firebase Realtime Database_Google Cloud Functions - Fatal编程技术网

Ios 在applicationWillTerminate中调用云函数

Ios 在applicationWillTerminate中调用云函数,ios,swift,firebase,firebase-realtime-database,google-cloud-functions,Ios,Swift,Firebase,Firebase Realtime Database,Google Cloud Functions,我想在应用程序即将关闭时从实时数据库中删除一些数据 我这样定义了函数(稍后将添加逻辑): 我从我的应用程序代表处调用它: func applicationWillTerminate(_ application: UIApplication) { print("Application will terminate") functions.httpsCallable("removeAllAssignedTeams").call(["judgeId": getUserPhoneNumb

我想在应用程序即将关闭时从实时数据库中删除一些数据

我这样定义了函数(稍后将添加逻辑):

我从我的应用程序代表处调用它:

func applicationWillTerminate(_ application: UIApplication) {
    print("Application will terminate")
    functions.httpsCallable("removeAllAssignedTeams").call(["judgeId": getUserPhoneNumber()]) { (_, _) in }
}

但在我的云函数控制台中,我从未看到该函数的任何日志,甚至没有该函数开始执行的迹象。我做错了什么?我怀疑你没有做错什么。应用程序进程更有可能在请求实际到达函数之前终止。根据报告:

此方法的实现大约需要五秒钟的时间 执行任何任务并返回。如果该方法在之前未返回 时间到期时,系统可能会完全终止进程

我建议在applicationWillTerminate之外测试您的代码,看看它是否按照您期望的方式工作。如果是这样,那么您可以假设它只是没有及时完成,以便在进程结束之前调用函数


还要记住,调用可调用函数是异步的,
call()
将在收到结果之前立即返回。因此,您的实现将立即返回,这可能是在向iOS发出信号,表明您已经完成了工作。即使您设法实现您的实现块,直到调用完成,它仍然可能在您的大约5秒之前完成。

< P>如果您想在用户断开时从实时数据库中删除数据,请考虑。有了这样一个处理程序,当is检测到客户机消失时,服务器将删除数据。这可能需要几分钟(取决于应用程序是如何关闭的),但通常比在应用程序关闭时尝试进行任何网络呼叫更可靠,因为当您调用
onDisconnect
时,有关如何操作的指令会直接发送到服务器

如果您使用的是
onDisconnect
处理程序,那么您可以在
应用程序willterminate
中通过调用。虽然这也有可能不起作用,但在这种情况下,服务器仍会在几分钟后检测到客户端已离开,而在离线调用成功的情况下,
onDisconnect
处理程序将立即执行


如果删除数据的代码比较复杂,请考虑在数据库中用一个<代码> OnDeStult< /Cuff>处理程序删除一个简单的值。然后,通过将一个云函数附加到删除该简单值,当服务器检测到客户端已离开时,云函数代码将运行。

我如何从这里调用云函数?它只涉及向数据库写入值。我正在按照您的建议进行设置。onUpdate的侦听器。但我注意到离线写入有时不会触发。我已经添加了
Database.Database().goOffline()
,但有时它会立即写入true/false。是的,我今天打算接受它。昨天太晚了。一旦我的用户按照您的建议登录,我将注册脱机写入。以前,我是在
willTerminate
中编写的,这导致写入不一致。正确,您需要尽快注册
onDisconnect
处理程序。实际上,它会直接向服务器发送一个延迟的写操作,这也是为什么您必须能够为写操作预先计算数据的原因(您可以这样做)。
func applicationWillTerminate(_ application: UIApplication) {
    print("Application will terminate")
    functions.httpsCallable("removeAllAssignedTeams").call(["judgeId": getUserPhoneNumber()]) { (_, _) in }
}