首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SendBird:搜索个人聊天和团体聊天

SendBird:搜索个人聊天和团体聊天
EN

Stack Overflow用户
提问于 2021-02-08 19:08:16
回答 1查看 380关注 0票数 2

SendBird将每个频道作为自己的GroupChannel。从技术上讲,1:1聊天也是一个只有两个用户的GroupChannel (使用isDistinct = true,当您再次创建它时,它会返回个人聊天)。

我的问题是,我如何搜索GroupChannel的名字,其中包括组和1:1聊天?组聊天将有一个共同的名称,将显示给组中的所有用户。但是对于1:1的聊天,GroupChannel不会有名字,如果有,就不会显示给用户,就像1:1聊天一样,我们总是显示对方的名字(就像几乎所有聊天系统的工作一样)。

通常,主UI列表包含组聊天和1:1聊天(所有GroupChannel)的混合。

代码语言:javascript
复制
 --------------------------------
|    Search Chat TextField       |
|--------------------------------|
|1  John (1:1)                   |
|2  John's Birthday Plan (group) |
|3  Johnney Eve (1:1)            |
|4  Johansson Fans (group)       |
|  ...                           |
 --------------------------------

从技术上讲,所有的项目都是GroupChannel。请注意,如列表中所示,所有的1:1聊天都没有实际的name。列表中显示的名称是另一个人的nickname

Expectation:

现在,如果用户搜索类似于"joh“的内容,那么它应该返回名称包含"joh”的所有组聊天或其他人的名字包含"joh“的所有1:1聊天。(基本上是上面示例中显示的所有项目。)

我的尝试:

实现这一目标的最初解决方案是将1:1通道名称保留为<user1 nickname> & <user2 nickname>,因此当用户按其名称搜索其他用户时,1:1通道就会像组信道一样出现。

示例代码:

代码语言:javascript
复制
query = SBDGroupChannel.createMyGroupChannelListQuery()
query?.order = .latestLastMessage
query?.limit = 30
query?.channelNameContainsFilter = "joh"
query.loadNextPage(...)

问题:

这方面的问题是:

  1. 如果用户搜索他们自己的名字(或者仅仅是分隔符&或一个空格),那么所有的个人聊天都是可见的,这是不相关的。
  2. 我的系统允许用户更改昵称,因此每次用户更改昵称时,都必须更新所有1:1通道名称(这是痛苦的)。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-09 17:51:32

苏尼尔

通常,当您为用户检索组通道列表时,它会检索用户可能是其中一部分的所有通道(取决于memberStateFilter)。

如果您显式地查找搜索,而不是提供用户所属的正在进行的通道列表,则可能可以使用基于userIds的滤波通道。您必须筛选由搜索用户和所需用户组成的通道。

让我们看一个例子,假设您的userId是John,并且您正在寻找与Jay的聊天:

代码语言:javascript
复制
let listQuery = SBDGroupChannel.createMyGroupChannelListQuery()
listQuery?.userIdsExactFilter = ["John", "Jay"]
listQuery?.loadNextPage(completionHandler: { (groupChannels, error) in
guard error == nil else {
    // Handle error.
}

// Only channelA is returned in a result list through the "list" parameter of the callback method.
...
})

如果您想显式地使用昵称

代码语言:javascript
复制
let listQuery = SBDGroupChannel.createMyGroupChannelListQuery()
listQuery?.nicknameContainsFilter = ["John", "Jay"]
listQuery?.loadNextPage(completionHandler: { (groupChannels, error) in
guard error == nil else {
    // Handle error.
}

// Only channelA is returned in a result list through the "list" parameter of the callback method.
...
})

您提到允许用户更改昵称,因此必须更新房间。可能值得给您的组通道(甚至1:1)通用名称,然后动态生成每个聊天的显示名称。因为每个通道都返回成员列表,所以您可以查看成员数组,筛选出登录的用户,然后从数组中提取其余用户的昵称。这将确保无论用户将昵称更改为什么,它总是准确的,并且在用户更新昵称时不必更新每个通道。

*更新日期02/10 *

谢谢你提供了一个例子来说明你想要达到的目标。看起来,您实际上是在使用OR操作符搜索channelNameContainsFilternicknameContainsFilter。这不是我们(Sendbird)目前在iOS SDK中支持的东西。所以问题是,你能做些什么来实现这一点?

一种选择是利用Platform API来获取这些信息。列出我的组频道具有search_querysearch_fields参数,可以使用OR运算符查找与您的值匹配的通道名和昵称。

或者,由于SDK确实返回为这些结果筛选所需的所有必要数据,所以您可以创建一个前端筛选器,它只显示与筛选结果匹配的项。因此,SDK返回完整的通道列表,存储该列表,然后当用户搜索时,通过筛选列表查找符合您需要的通道,并仅显示这些通道。

顺便提一句,堆栈溢出可能不是这类讨论的最佳位置,因为有很多来回的讨论。请随时加入我们的社区,以获得更多的支持。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66107811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档