2

SendBird 将每个频道视为他们的GroupChannel. 1:1 聊天在技术上也GroupChannel只有两个用户(isDistinct = true因此当您尝试再次创建它时,它会返回个人聊天)。

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

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

 --------------------------------
|    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

期待:

现在,如果用户搜索“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(...)

问题:

这样做的问题是:

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

1 回答 1

1

苏尼尔,

通常,当您检索用户的组频道列表时,它会检索用户可能属于的所有频道(取决于 memberStateFilter)。

如果您明确地寻找search,而不是提供用户所属频道的持续列表,您可以通过 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)提供通用名称,然后动态生成每个聊天的显示名称。由于每个频道都返回成员列表,您可以查看成员数组,过滤掉已登录的用户,然后从数组中提取剩余用户的昵称。这将确保无论用户将他们的昵称更改为什么,它始终是准确的,并且您不必在用户更新他们的昵称时更新每个频道。

************ 2010 年 2 月更新 ************

感谢您提供您希望实现的目标的示例。看起来您实际上是在尝试同时搜索channelNameContainsFilternicknameContainsFilter使用 OR 运算符。这不是我们(Sendbird)目前在 iOS SDK 中支持的东西。所以问题是,你能做些什么来实现这一目标?

一种选择是利用平台 API 来获取此信息。List my group channels具有search_query和参数,search_fields可让您使用 OR 运算符查找与您的值匹配的频道名称和昵称。

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

作为旁注,Stackoverflow 可能不是此类讨论的最佳场所,因为有很多来回。请随时加入我们的社区以获得更多支持。

于 2021-02-09T17:51:32.637 回答