8000 Fix poor message search performance (#680) · GetStream/stream-chat-swiftui@6525d6b · GitHub
[go: up one dir, main page]

Skip to content

Commit 6525d6b

Browse files
authored
Fix poor message search performance (#680)
* Improve performance of Message Search * Using background approach instead of using dataStore with cache * Optimize even further * Update CHANGELOG.md * Use ChatClient directly * Update CHANGELOG.md * Update CHANGELOG.md
1 parent 2f8874c commit 6525d6b

File tree

3 files changed

+22
-29
lines changed

3 files changed

+22
-29
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
33

44
# Upcoming
55

6-
### 🔄 Changed
6+
### ⚡ Performance
7+
- Improve message search performance [#680](https://github.com/GetStream/stream-chat-swiftui/pull/680)
78

89
# [4.68.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.68.0)
910
_December 03, 2024_

Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
105105
internal var channelListSearchController: ChatChannelListController?
106106
internal var messageSearchController: ChatMessageSearchController?
107107

108+
/// Serial queue used to process the search results.
109+
private let queue = DispatchQueue(label: "com.getstream.stream-chat-swiftui.ChatChannelListViewModel")
110+
108111
@Published public var loadingSearchResults = false
109112
@Published public var searchResults = [ChannelSelectionInfo]()
110113
@Published var hideTabBar = false
@@ -362,7 +365,6 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
362365
messageSearchController.loadNextMessages { [weak self] _ in
363366
guard let self = self else { return }
364367
self.loadingNextChannels = false
365-
self.updateMessageSearchResults()
366368
}
367369
}
368370
}
@@ -387,18 +389,12 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
387389
}
388390

389391
private func performMessageSearch() {
390-
guard let userId = chatClient.currentUserId else { return }
391392
messageSearchController = chatClient.messageSearchController()
392393
messageSearchController?.delegate = self
393-
let query = MessageSearchQuery(
394-
channelFilter: .containMembers(userIds: [userId]),
395-
messageFilter: .autocomplete(.text, text: searchText)
396-
)
397394
loadingSearchResults = true
398-
messageSearchController?.search(query: query, completion: { [weak self] _ in
395+
messageSearchController?.search(text: searchText) { [weak self] _ in
399396
self?.loadingSearchResults = false
400-
self?.updateMessageSearchResults()
401-
})
397+
}
402398
}
403399

404400
private func performChannelSearch() {
@@ -423,10 +419,22 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
423419
return
424420
}
425421

426-
searchResults = messageSearchController.messages
427-
.compactMap { message in
428-
message.makeChannelSelectionInfo(with: chatClient)
422+
queue.async { [weak self] in
423+
let results: [ChannelSelectionInfo] = messageSearchController.messages.compactMap { message in
424+
guard let channelId = message.cid else { return nil }
425+
guard let channel = self?.chatClient.channelController(for: channelId).channel else {
426+
return nil
427+
}
428+
return ChannelSelectionInfo(
429+
channel: channel,
430+
message: message,
431+
searchType: .channels
432+
)
429433
}
434+
DispatchQueue.main.async {
435+
self?.searchResults = results
436+
}
437+
}
430438
}
431439

432440
private func updateChannelSearchResults() {

Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelNavigatableListItem.swift

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -108,19 +108,3 @@ extension ChatChannel {
108108
ChannelSelectionInfo(channel: self, message: nil)
109109
}
110110
}
111-
112-
extension ChatMessage {
113-
114-
func makeChannelSelectionInfo(with chatClient: ChatClient) -> ChannelSelectionInfo? {
115-
if let channelId = cid,
116-
let channel = chatClient.channelController(for: channelId).channel {
117-
let searchResult = ChannelSelectionInfo(
118-
channel: channel,
119-
message: self
120-
)
121-
return searchResult
122-
} else {
123-
return nil
124-
}
125-
}
126-
}

0 commit comments

Comments
 (0)
0