在群组和公共聊天的情况下,如何使用 QMServicesManager 从对话框列表中删除对话框?

Posted

技术标签:

【中文标题】在群组和公共聊天的情况下,如何使用 QMServicesManager 从对话框列表中删除对话框?【英文标题】:How to remove dialog from dialog list Using QMServicesManager in case of Group and Public chat? 【发布时间】:2016-05-19 06:38:01 【问题描述】:

这个问题是对我之前的问题的扩展,提出了新的要求。 This is My Previous question。

所以我的新要求是

现在如果我想删除群聊,我应该如何处理?如果我在其中使用相同的方法,我们会将 forAllUsers 传递为硬编码的“NO”。写在 QMChatServices.m 中

- (void)deleteDialogWithID:(NSString *)dialogId completion:(void (^)(QBResponse *))completion 

    NSParameterAssert(dialogId);

    __weak __typeof(self)weakSelf = self;

    [QBRequest deleteDialogsWithIDs:[NSSet setWithObject:dialogId] forAllUsers:NO successBlock:^(QBResponse *response, NSArray *deletedObjectsIDs, NSArray *notFoundObjectsIDs, NSArray *wrongPermissionsObjectsIDs) 
        //
        [weakSelf.dialogsMemoryStorage deleteChatDialogWithID:dialogId];
        [weakSelf.messagesMemoryStorage deleteMessagesWithDialogID:dialogId];

        if ([weakSelf.multicastDelegate respondsToSelector:@selector(chatService:didDeleteChatDialogWithIDFromMemoryStorage:)]) 
            [weakSelf.multicastDelegate chatService:weakSelf didDeleteChatDialogWithIDFromMemoryStorage:dialogId];
        

        [weakSelf.loadedAllMessages removeObjectsForKeys:deletedObjectsIDs];

        if (completion) 
            completion(response);
        
     errorBlock:^(QBResponse *response) 
        //
        if (response.status == QBResponseStatusCodeNotFound || response.status == 403) 
            [weakSelf.dialogsMemoryStorage deleteChatDialogWithID:dialogId];

            if ([weakSelf.multicastDelegate respondsToSelector:@selector(chatService:didDeleteChatDialogWithIDFromMemoryStorage:)]) 
                [weakSelf.multicastDelegate chatService:weakSelf didDeleteChatDialogWithIDFromMemoryStorage:dialogId];
            
        
        else 

            [weakSelf.serviceManager handleErrorResponse:response];
        

        if (completion) 
            completion(response);
        
    ];

所以现在我的疑问是..

问题 1:如果我们想删除所有用户的对话框怎么办。问题 2:假设有 3 个用户。用户 1 、用户 2 和用户 3。现在 User1 已经用 User2 和 User3 创建了组。

那么这个方法对所有不同的 3 个用户有什么用处。我的意思是如果 User1 使用会发生什么

[ServicesManager.instance.chatService deleteDialogWithID:dialog.ID completion:nil];

如果 User2 和 User3 使用相同的方法会发生什么。

天气它作为退出对话框或删除对话框。在群组和公共聊天的情况下,我对这种方法如何适用于不同用户感到有点困惑。

问题3:有没有其他退出群聊的方法?我希望它是清楚的!!

【问题讨论】:

从内存存储中删除聊天对话并没有删除对话,并且以某种方式从服务器获取再次带来了它。我阅读了您的代码并为对话调用删除委托解决了问题。 【参考方案1】:

    你说得对,现在没有删除所有用户对话框的界面。但请记住,只有组对话的所有者(其创建者)can delete it。并且所有者不能更改,即使他将离开对话框。我们将考虑在不久的将来添加这种方法,但现在您可以根据需要轻松修改它(欢迎您从我们的服务存储库中分叉)。

    如果任何用户使用此方法 - 他将退出该组(通过服务器),但组本身仍将与其他成员一起存在。但是其他成员只有在从 REST 重新下载对话框时才会知道离开的用户。因此,为了实时通知他们,我们在离开前发送 XMPP 通知,like this one

    和我在 2 中所说的差不多。通过 REST (QBRequest) 请求通知用户我们离开和删除对话框。

【讨论】:

以上是关于在群组和公共聊天的情况下,如何使用 QMServicesManager 从对话框列表中删除对话框?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Telegram 中下载群组的聊天记录?

如何使用电报内联机器人获取组 ID 和聊天 ID?

如何在不打开 WhatsApp 的情况下向 WhatsApp 群组发送消息?

Quickblox chatRoomDidReceiveMessage 没有调用

在群聊的远程视频上显示用户名,群聊的举手功能

在 ejabberd 用户下线时离开组