如何在异常处理程序中运行方法?

时间:2013-08-20 17:27:27

标签: ios objective-c parse-platform

我有一个异常处理程序,当我的代码崩溃时运行,但我还需要向服务器(parse.com)发送一个消息,以便让服务器知道玩家已停止播放,

void onUncaughtException(NSException *exception)
{
    NSLog(@"uncaught exception: %@", exception.description);
    [self playerLoggedOut];
}

playerloggedOut行给出未声明标识符self的错误。

如何在异常发生时运行playerLoggedOut方法?

3 个答案:

答案 0 :(得分:1)

  

如何在异常发生时运行playerLoggedOut方法?

您无法启动一些冗长的过程,例如建立网络连接和发送消息。您最好的策略可能是保存信息并在应用程序再次启动时发送,以便服务器可以更新其记录或其他内容。或者,让客户端每隔t秒检入一次服务器;如果服务器在2t之类的某个时间间隔内没有收到来自客户端的消息,则表示客户端已停止运行。

答案 1 :(得分:1)

首先:self未知,因为你不是一个方法,而是一个函数。函数不在对象上下文中运行,因此不了解自己。

正如Caleb之前提到的,如果服务器暂时没有从客户端获取消息(以秒为单位),那么你应该在服务器端有一个监视器自动记录播放器。为防止自动注销,当用户处于非活动状态(但仍在播放)时,您可以使用NSTimer的实例在客户端上实现心跳。

答案 2 :(得分:0)

正如其他人所说的那样,不要尝试在异常处理程序中与Parse服务器进行交谈等昂贵的事情。

关于您实际想要实现的目标,您可能需要重新考虑您的架构。

在有时连接的移动设备世界中,您的连接会随处可见。考虑到IsLoggedIn的UTC日期时间而不是LastUserActivity的布尔标志,并使用一条规则,如果最后一个活动是在最后5分钟,或者是任何合适的,那么它们将被视为已登录

如果通过Cloud Code完成对Parse的所有访问,那么您可以轻松添加一个函数调用,为每个方法设置LastUserActivity,然后您还可以避免时间同步问题,因为您将始终使用服务器的时钟。

如果您想获得所有在线用户的列表,您可以只查询LastUserActivity大于5分钟前的位置(或您设置的任何限制)。