0

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

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

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

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

4

3 回答 3

1

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

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

于 2013-08-20T17:40:23.177 回答
1

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

正如 Caleb 之前提到的,如果服务器有一段时间(以秒为单位)没有收到来自客户端的消息,您应该在服务器端有一个自动注销玩家的看门狗。为了防止自动注销,当用户处于非活动状态(但仍在玩)时,您可以使用NSTimer.

于 2013-08-20T19:13:00.197 回答
0

正如其他人所说,不要尝试做昂贵的事情,例如在异常处理程序中与 Parse 服务器对话。

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

在有时连接的移动设备世界中,您的连接会来来去去。代替布尔标志IsLoggedIn,考虑 UTC 日期时间LastUserActivity,并使用一条规则,如果最后一个活动是在最后 5 分钟内或任何合适的时间,则认为他们已登录。

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

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

于 2013-08-20T23:43:42.787 回答