ios - QuickBlox-对话框必须在Objective-C中的内存缓存中

标签 ios objective-c swift xcode quickblox

我已经创建了一个聊天应用程序。我已经使用QuickBlox互相聊天。

我已经注册了两个用户并相互聊天,它将可以完美地工作。
但是,当用户注销并再次登录时,它将崩溃。

错误-对话框必须在内存缓存中!

例如: A B 用户使用他们的设备登录,然后在他们注销并再次登录以及发送消息应用程序崩溃时彼此聊天。

登录

- (void)loginWithQuickBlox:(NSString *)idandPassword {
    [QBRequest logInWithUserLogin:idandPassword password:idandPassword successBlock:^(QBResponse *response, QBUUser *user)
     {
        // NSLog(@"User Id : %ld",(unsigned long)user.ID);

         NSString *usrID=[NSString stringWithFormat:@"%ld",(unsigned long)user.ID];
         [[NSUserDefaults standardUserDefaults]setObject:usrID forKey:@"LoginQuickbloxID"];

         [self loginWithQuickBloxChat:idandPassword];
     } errorBlock:^(QBResponse *response)
     {
         // error handling
         NSLog(@"error: %@", response.error);
     }];
}

- (void)loginWithQuickBloxChat:(NSString *)idandPassword {

    QBUUser *selectedUser = [QBUUser user];
    selectedUser.password = idandPassword;
    selectedUser.login = idandPassword;

    [ServicesManager.instance logInWithUser:selectedUser completion:^(BOOL success, NSString *errorMessage)
     {
         if (success)
         {
             [self getRecenetChatUsingInBadgeCount];
             NSLog(@"Login in Quickblox");
             [[NSUserDefaults standardUserDefaults]setObject:idandPassword forKey:@"QuickbloxIDPass"];
         }
         else
         {
             NSLog(@"Error in QuickBlox");
         }
     }];
}

聊天

与ChatViewController聊天。

注销

1)未订阅的设备 token
NSString *deviceUdid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
                [QBRequest unregisterSubscriptionForUniqueDeviceIdentifier:deviceUdid successBlock:^(QBResponse *response) {
                    // Unsubscribed successfully
                       NSLog(@"Unsubscribed successfully");

                } errorBlock:^(QBError *error) {
                    // Handle error
                    NSLog(@"Unsubscribed ERROR");
                }];

2)ServicesManager注销
[ServicesManager.instance logoutWithCompletion:^{

           NSLog(@"logoutWithCompletion");

    }];

3)注销成功块
[QBRequest logOutWithSuccessBlock:^(QBResponse *response) {
           // Successful logout
              NSLog(@"Successful logout");

     } errorBlock:^(QBResponse *response) {
              // Handle error
               NSLog(@"Logout ERROR %@",response);
   }];

当注销后发送消息并再次登录时,此处崩溃

QMChatService.m
- (void)sendMessage:(QBChatMessage *)message
         toDialogID:(NSString *)dialogID
      saveToHistory:(BOOL)saveToHistory
      saveToStorage:(BOOL)saveToStorage
         completion:(QBChatCompletionBlock)completion
{
    NSCParameterAssert(dialogID);
    QBChatDialog *dialog = [self.dialogsMemoryStorage chatDialogWithID:dialogID];
    NSAssert(dialog != nil, @"Dialog have to be in memory cache!");

    [self sendMessage:message toDialog:dialog saveToHistory:saveToHistory saveToStorage:saveToStorage completion:completion];
}

最佳答案

答案来晚了,但是也许有人会觉得有用。

为了使对话在内存中,必须使用正确的方法加载对话(某些方法不执行此操作)。

这是我的操作方法(但很抱歉,对不起)

private func sendMessage(message: QBChatMessage) {
    if ServicesManager.instance().chatService.dialogsMemoryStorage.chatDialog(withID: self.dialog.id!) != nil {
        self.send(message: message)
    } else {
        loadAndSaveToMemoryDialog(message)
    }
}

private func send(message: QBChatMessage) {
    ServicesManager.instance().chatService.send(message, toDialogID: self.dialog.id!, saveToHistory: true, saveToStorage: true) { (error in
        if error != nil {
            QMMessageNotificationManager.showNotification(withTitle: "SA_STR_ERROR", subtitle: error?.localizedDescription, type: .error, handler: nil)
        }
    }
}

private func loadAndSaveToMemoryDialog(_ message: QBChatMessage) {
    ServicesManager.instance().chatService.loadDialog(withID: self.dialog.id!) {
        [weak self] _ in
        guard let self = self else { return }
        self.sendMessage(message: message)
    }
}

关于ios - QuickBlox-对话框必须在Objective-C中的内存缓存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43802973/

相关文章:

swift - 为什么 Dispatch Group Notify 会被调用两次?

swift - 如何在swift中访问for循环外的变量

ios - 如何查看 Objective C 协议(protocol)的内容?

ios - 从 UIImageView 生成图像时分辨率损失

ios - 在标签栏中为更多按钮设置图像

ios - UIScrollView中的UIView不调整宽度

ios - 为什么即使在获取数据后,cellForRow 函数中的单元格标签和数组仍为空白?

ios - 如何在 iOS 6 中为文本添加下划线?

IOS启动时发生未知崩溃,没有崩溃日志,没有报告,我该如何捕获它?

ios - 沿圆圈移动按钮