2013-08-20 50 views
0

我有一個運行時,我的代碼崩潰的異常處理程序,但我也需要一個MSG發送到服務器(parse.com)當發生這種情況,讓服務器知道玩家已經停止播放,如何在異常處理程序中運行方法?

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

playerloggedOut行給出了未聲明的標識符self的錯誤。

我怎樣才能運行playerLoggedOut方法,當發生異常?

回答

1

如何在發生異常時運行playerLoggedOut方法?

您無法啓動一些冗長的過程,如建立網絡連接和發送消息。您的最佳策略可能是保存信息並在應用程序再次啓動時發送,以便服務器可以更新其記錄或任何其他信息。或者,讓客戶端每隔t秒與服務器簽入;如果服務器在某個時間間隔(如2t)內沒有收到客戶端的消息,則認爲客戶端已停止運行。

1

首先:self是未知的,因爲你不是一個方法,而是一個功能。函數不在對象上下文中運行,因此不知道自己。

正如迦勒前面提到的,你應該有服務器端看門狗自動登錄一個球員出來,如果服務器沒有得到來自客戶端的消息一會兒(以秒爲單位)。爲防止自動註銷,當用戶處於禁用狀態(但仍在播放)時,可以使用NSTimer的實例在客戶端上實現心跳。

0

正如其他人所指出的,不要試圖做昂貴的東西喜歡說話的解析服務器在您的異常處理程序。

在問候你實際上是試圖實現,你可能要重新考慮你的架構。

在移動設備中的有時連接的世界中,你將有你的連接來來去去。請考慮UTC日期時間爲LastUserActivity,而不是使用布爾標誌IsLoggedIn,並使用一條規則說明如果最後一次活動在最後5分鐘內,或者任何合適的時間,都會被視爲已登錄。

如果所有對Parse的訪問均通過Cloud Code完成,那麼您可以輕鬆添加一個函數調用,將LastUserActivity設置爲每種方法,然後您也可以避免時間同步問題,因爲您始終使用服務器時鐘。

如果您想獲得所有在線用戶的列表,則可以查詢LastUserActivity大於5分鐘前的位置(或您設置的任何限制)。

相關問題