Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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 Firebase:当用户杀死应用程序时,如何从Firebase清除特定数据?_Ios_Swift_Firebase_Firebase Realtime Database_Applicationwillterminate - Fatal编程技术网

Ios 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

我有一个使用firebase作为数据库的应用程序,我想在用户杀死该应用程序时清除名为
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当我直接杀掉应用程序时,我想你是对的。我现在使用的是不同的方法。谢谢你的回答:)我想你是对的。我现在使用不同的方法。谢谢你的回答……)