2014-07-22 88 views
0

我正在檢查我的AppDelegate.mRootViewController.mViewControllerB.m中的傳入郵件。取消訂閱頻道後郵件接收觀察員不起作用

用戶打開應用程序(首次啓動 - 安裝)後,註冊並登錄後,所有內容都能正常工作。 5秒或50分鐘後(無關緊要)當前用戶註銷,並且新用戶創建新帳戶或使用現有配置文件登錄。現在,當前用戶向他自己的頻道發送了一條消息(成功),但是這次消息觀察者不工作,沒有來自觀察者的日誌。但是,如果我從Xcode關閉應用程序並再次啓動它,它會再次正常工作。

我確定這不是網絡問題,因爲歷史記錄包含我發送的每條消息以及客戶端每次連接的每條消息。但不幸的是,消息接收觀察員喜歡他們不存在。

我懷疑當用戶註銷並退出他正在收聽的頻道時會出現問題。我已經嘗試過,沒有removeMessageReceiveObserver:,但沒有幫助我。

這是我推倒訂閱當用戶註銷:

if (cell == staticCell) { 
    ... 
    NSArray *unsubscribe = @[channel1, channel2]; 
    //unsubscribe user from channels 
    [PubNub unsubscribeFromChannels:unsubscribe]; 
    // remove observer and disconnect from PubNub. 
    [[PNObservationCenter defaultCenter] removeMessageReceiveObserver:self]; 
    [PubNub disconnect]; // also tried without closing the connection 

    //log out user 
    [PFUser logOut]; 
    [self presentLoginViewControllerAnimated:YES]; 

這是我的觀察:

// I'm using this in RootViewController.m and ViewControllerB.m 
[[PNObservationCenter defaultCenter] addMessageReceiveObserver:self withBlock:^(PNMessage *message) { 

     if ([message.channel.name isEqualToString:my_channel]) { 
      NSLog(@" message: %@ ", message.message); 
} 


// AppDelegate.m 

- (void)pubnubClient:(PubNub *)client didReceiveMessage:(PNMessage *)message { 

if ([message.channel.name isEqualToString:my_channel]) { 

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"New message" 
                 message: messageContent delegate:self 
               cancelButtonTitle:@"Ok!" 
               otherButtonTitles:nil, nil]; 
    [alertView show]; 

} 

難道我錯過了什麼?在我退訂之前是否還有其他方法應該實施?

回答

1

您應該在您想要接收消息的渠道上訂閱。如果客戶端沒有看到它們,觀察者將不會通知消息,因爲您退訂了它們。 PubNub客戶端將通知您訂閱的頻道上的新消息,如果沒有頻道,則不會有任何事件。

+0

我在前一位用戶註銷後訂閱新頻道。但有趣的是,在你回答之後,我測試了另一種情況。用戶A註銷,用戶B登錄 - 不起作用 - 然後,用戶B註銷並在註銷後再次登錄,並再次運行。可能有觀察員之間的最短時間可以改變他們的「目標」渠道嗎? – rihe

+1

當你在用戶之間切換時,我認爲視圖控制器已經解除了分配,所以你應該使用這個'[[PNObservationCenter defaultCenter] removeMessageReceiveObserver:self]'將其作爲觀察者移除。每次打開視圖控制器並希望它接收新消息的通知時,都需要爲這種事件添加觀察者。 –

+0

我已經把它放到我的視圖控制器'viewWillDisappear'方法中,但仍然是一樣的。然而,我無法對'AppDelegate'中的'pubnubClient:didReceiveMessage:'做任何事情,可能就是這個問題。我也嘗試使用'resetCenter'方法,但無法調用'[PNObservationCenter resetCenter]',因爲它受到保護。以某種方式可能嗎?用一個通話銷燬所有觀察者將是一個驚人的解決方案。 – rihe