Ios Firebase:当用户杀死应用程序时,如何从Firebase清除特定数据?
我有一个使用firebase作为数据库的应用程序,我想在用户杀死该应用程序时清除名为Ios Firebase:当用户杀死应用程序时,如何从Firebase清除特定数据?,ios,swift,firebase,firebase-realtime-database,applicationwillterminate,Ios,Swift,Firebase,Firebase Realtime Database,Applicationwillterminate,我有一个使用firebase作为数据库的应用程序,我想在用户杀死该应用程序时清除名为current\u vention的特定用户字段,为此,我正在使用AppDelegate方法applicationWillTerminate,当我杀死该应用程序时,它实际上正在调用,但不是完全 下面是我在AppDelegate中的代码: func applicationWillTerminate(_ application: UIApplication) { // Called when the appl
current\u vention
的特定用户字段,为此,我正在使用AppDelegate
方法applicationWillTerminate
,当我杀死该应用程序时,它实际上正在调用,但不是完全
下面是我在AppDelegate
中的代码:
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
WebServiceAPI.checkOutVenue()
}
另一种方法是:
static func checkOutVenue() {
WebServiceAPI.sharedInstance.current_venue = ""
if WebServiceAPI.sharedInstance.user == nil {
return
}
let user = WebServiceAPI.sharedInstance.user!
let ref = FIRDatabase.database().reference()
ref.child("Clients").child(user.uid).child("current_venue").setValue("") { (err, venueIdRef) in
if err == nil {
WebServiceAPI.sharedInstance.current_venue = ""
}
}
}
我试着调试它,如下图所示:
当我杀死应用程序时,断点1和2正在调用,但从未到达断点3
我阅读了以下文件:
上面说:
此方法的实现大约有五秒钟的时间来执行任何任务并返回。如果该方法在时间到期之前未返回,系统可能会完全终止该进程
实际上,从firebase清除该区域不需要超过5秒
当我打开应用程序时,同样的代码工作正常
因此,我的代码运行良好,但当我关闭应用程序时,我缺少了一些东西
感谢您的帮助。在ApplicationWillTerminate中执行异步任务并不是最好的方法,因为您有5秒钟的时间来确保异步任务根据internet连接的强度完成执行(对于您来说,对于普通用户,这可能需要不到5秒的时间,这可能需要更长的时间),否则进程将被终止 正如我在评论部分提到的,还有一个案例,即使你得到了这份工作,你也没有想到: 如果用户首先将应用程序切换到后台,然后尝试终止应用程序,则不会调用applicationWillTerminate。 你正在尝试理论上不可能的事情 试着想想这样的事情:
func applicationDidEnterBackground(_ application: UIApplication) {
WebServiceAPI.checkOutVenue()
}
在ApplicationWillTerminate中执行异步任务并不是最好的方法,因为根据internet连接的强度,您有5秒的时间来确保异步任务完成执行(对于您来说,对于普通用户,这可能需要不到5秒的时间,这可能需要更多时间),否则进程将被终止 正如我在评论部分提到的,还有一个案例,即使你得到了这份工作,你也没有想到: 如果用户首先将应用程序切换到后台,然后尝试终止应用程序,则不会调用applicationWillTerminate。 你正在尝试理论上不可能的事情 试着想想这样的事情:
func applicationDidEnterBackground(_ application: UIApplication) {
WebServiceAPI.checkOutVenue()
}
确保在用户断开连接时清理数据的更好方法是使用
onDisconnect
处理程序。下面是一个简单的示例,说明如何使用它:
ref.child("Clients")
.child(user.uid)
.child("current_venue")
.onDisconnectRemoveValue()
执行此代码时,会将指令发送到服务器,以便在客户端断开连接时删除节点。这意味着它将始终运行,即使客户端(甚至手机)断开连接崩溃,客户端代码永远无法执行。确保用户断开连接时数据被清理的更好方法是使用
onDisconnect
处理程序。下面是一个简单的示例,说明如何使用它:
ref.child("Clients")
.child(user.uid)
.child("current_venue")
.onDisconnectRemoveValue()
执行此代码时,会将指令发送到服务器,以便在客户端断开连接时删除节点。这意味着它将始终运行,即使客户端(甚至手机)断开连接崩溃,客户端代码永远无法执行。您确定错误==nil吗?您也需要考虑这个问题:如果用户首先将应用程序切换到后台,然后尝试终止应用程序,则不会调用applicationWillTerminate。@Achrefgasoumi添加了else条件,但它也不会调用。但是
applicationWill当我直接终止应用程序时,终止调用。@AchrefGassoumi添加了else条件,但它也没有调用。applicationWillTerminate
cal当我直接杀掉应用程序时,我想你是对的。我现在使用的是不同的方法。谢谢你的回答:)我想你是对的。我现在使用不同的方法。谢谢你的回答……)