我有一个异常处理程序,当我的代码崩溃时运行,但我还需要向服务器(parse.com)发送一个消息,以便让服务器知道玩家已停止播放,
void onUncaughtException(NSException *exception)
{
NSLog(@"uncaught exception: %@", exception.description);
[self playerLoggedOut];
}
playerloggedOut行给出未声明标识符self的错误。
如何在异常发生时运行playerLoggedOut方法?
答案 0 :(得分:1)
如何在异常发生时运行playerLoggedOut方法?
您无法启动一些冗长的过程,例如建立网络连接和发送消息。您最好的策略可能是保存信息并在应用程序再次启动时发送,以便服务器可以更新其记录或其他内容。或者,让客户端每隔t
秒检入一次服务器;如果服务器在2t
之类的某个时间间隔内没有收到来自客户端的消息,则表示客户端已停止运行。
答案 1 :(得分:1)
首先:self
未知,因为你不是一个方法,而是一个函数。函数不在对象上下文中运行,因此不了解自己。
正如Caleb之前提到的,如果服务器暂时没有从客户端获取消息(以秒为单位),那么你应该在服务器端有一个监视器自动记录播放器。为防止自动注销,当用户处于非活动状态(但仍在播放)时,您可以使用NSTimer
的实例在客户端上实现心跳。
答案 2 :(得分:0)
正如其他人所说的那样,不要尝试在异常处理程序中与Parse服务器进行交谈等昂贵的事情。
关于您实际想要实现的目标,您可能需要重新考虑您的架构。
在有时连接的移动设备世界中,您的连接会随处可见。考虑到IsLoggedIn
的UTC日期时间而不是LastUserActivity
的布尔标志,并使用一条规则,如果最后一个活动是在最后5分钟,或者是任何合适的,那么它们将被视为已登录
如果通过Cloud Code完成对Parse的所有访问,那么您可以轻松添加一个函数调用,为每个方法设置LastUserActivity
,然后您还可以避免时间同步问题,因为您将始终使用服务器的时钟。
如果您想获得所有在线用户的列表,您可以只查询LastUserActivity
大于5分钟前的位置(或您设置的任何限制)。