SendBird将每个频道作为自己的GroupChannel。从技术上讲,1:1聊天也是一个只有两个用户的GroupChannel (使用isDistinct = true,当您再次创建它时,它会返回个人聊天)。
我的问题是,我如何搜索GroupChannel的名字,其中包括组和1:1聊天?组聊天将有一个共同的名称,将显示给组中的所有用户。但是对于1:1的聊天,GroupChannel不会有名字,如果有,就不会显示给用户,就像1:1聊天一样,我们总是显示对方的名字(就像几乎所有聊天系统的工作一样)。
通常,主UI列表包含组聊天和1:1聊天(所有GroupChannel)的混合。
--------------------------------
| 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通道就会像组信道一样出现。
示例代码:
query = SBDGroupChannel.createMyGroupChannelListQuery()
query?.order = .latestLastMessage
query?.limit = 30
query?.channelNameContainsFilter = "joh"
query.loadNextPage(...)问题:
这方面的问题是:
&或一个空格),那么所有的个人聊天都是可见的,这是不相关的。发布于 2021-02-09 17:51:32
苏尼尔
通常,当您为用户检索组通道列表时,它会检索用户可能是其中一部分的所有通道(取决于memberStateFilter)。
如果您显式地查找搜索,而不是提供用户所属的正在进行的通道列表,则可能可以使用基于userIds的滤波通道。您必须筛选由搜索用户和所需用户组成的通道。
让我们看一个例子,假设您的userId是John,并且您正在寻找与Jay的聊天:
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.
...
})如果您想显式地使用昵称
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操作符搜索channelNameContainsFilter和nicknameContainsFilter。这不是我们(Sendbird)目前在iOS SDK中支持的东西。所以问题是,你能做些什么来实现这一点?
一种选择是利用Platform API来获取这些信息。列出我的组频道具有search_query和search_fields参数,可以使用OR运算符查找与您的值匹配的通道名和昵称。
或者,由于SDK确实返回为这些结果筛选所需的所有必要数据,所以您可以创建一个前端筛选器,它只显示与筛选结果匹配的项。因此,SDK返回完整的通道列表,存储该列表,然后当用户搜索时,通过筛选列表查找符合您需要的通道,并仅显示这些通道。
顺便提一句,堆栈溢出可能不是这类讨论的最佳位置,因为有很多来回的讨论。请随时加入我们的社区,以获得更多的支持。
https://stackoverflow.com/questions/66107811
复制相似问题