Skip to content

Commit 18f47dc

Browse files
committed
Fix crash in ChatChannelViewModel.handleMessageAppear()
1 parent dfcd961 commit 18f47dc

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource {
5050
private var channelName = ""
5151
private var onlineIndicatorShown = false
5252
private var lastReadMessageId: String?
53-
var throttler = Throttler(interval: 3, broadcastLatestEvent: true)
53+
var throttler = Throttler(interval: 3, broadcastLatestEvent: true, queue: .main)
5454

5555
public var channelController: ChatChannelController
5656
public var messageController: ChatMessageController?
@@ -833,6 +833,7 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource {
833833
}
834834

835835
deinit {
836+
throttler.cancel()
836837
messageCachingUtils.clearCache()
837838
if messageController == nil {
838839
utils.channelControllerFactory.clearCurrentController()

StreamChatSwiftUITests/Tests/ChatChannel/ChatChannelViewModel_Tests.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,31 @@ class ChatChannelViewModel_Tests: StreamChatTestCase {
772772
XCTAssertEqual(0, channelController.markReadCallCount)
773773
}
774774

775+
func test_chatChannelVM_handleMessageAppear_doesNotCrashWhenDeallocated() {
776+
let message = ChatMessage.mock()
777+
let channelController = makeChannelController(messages: [message])
778+
channelController.hasLoadedAllNextMessages_mock = nil
779+
channelController.channel_mock = .mock(
780+
cid: .unique,
781+
unreadCount: ChannelUnreadCount(messages: 1, mentions: 0)
782+
)
783+
784+
for _ in 0..<1000 {
785+
autoreleasepool {
786+
let viewModel = ChatChannelViewModel(channelController: channelController)
787+
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
788+
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
789+
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
790+
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
791+
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
792+
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
793+
}
794+
}
795+
796+
// Then - Should not crash
797+
XCTAssert(true)
798+
}
799+
775800
// MARK: - highlightMessage Tests
776801

777802
func test_highlightMessage_highlightsWhenSkipHighlightMessageIdIsNotSet() {

0 commit comments

Comments
 (0)