5
5
import Foundation
6
6
import StreamChat
7
7
8
+ /// Caches messages related data to avoid accessing the database.
9
+ /// Cleared on chat channel view dismiss or memory warning.
8
10
class MessageCachingUtils {
9
11
10
- private var messageAuthorMapping = [ String: UserDisplayInfo] ( )
12
+ private var messageAuthorMapping = [ String: String] ( )
13
+ private var messageAuthors = [ String: UserDisplayInfo] ( )
11
14
private var messageAttachments = [ String: Bool] ( )
12
15
private var checkedMessageIds = Set < String > ( )
13
16
private var quotedMessageMapping = [ String: ChatMessage] ( )
14
17
15
18
func authorId( for message: ChatMessage ) -> String {
16
- if let userDisplayInfo = messageAuthorMapping [ message. id ] {
19
+ if let userDisplayInfo = userDisplayInfo ( for : message) {
17
20
return userDisplayInfo. id
18
21
}
19
22
@@ -22,7 +25,7 @@ class MessageCachingUtils {
22
25
}
23
26
24
27
func authorName( for message: ChatMessage ) -> String {
25
- if let userDisplayInfo = messageAuthorMapping [ message. id ] {
28
+ if let userDisplayInfo = userDisplayInfo ( for : message) {
26
29
return userDisplayInfo. name
27
30
}
28
31
@@ -31,7 +34,7 @@ class MessageCachingUtils {
31
34
}
32
35
33
36
func authorImageURL( for message: ChatMessage ) -> URL ? {
34
- if let userDisplayInfo = messageAuthorMapping [ message. id ] {
37
+ if let userDisplayInfo = userDisplayInfo ( for : message) {
35
38
return userDisplayInfo. imageURL
36
39
}
37
40
@@ -58,14 +61,35 @@ class MessageCachingUtils {
58
61
return quoted
59
62
}
60
63
64
+ func clearCache( ) {
65
+ log. debug ( " Clearing cached message data " )
66
+ messageAuthorMapping = [ String: String] ( )
67
+ messageAuthors = [ String: UserDisplayInfo] ( )
68
+ messageAttachments = [ String: Bool] ( )
69
+ checkedMessageIds = Set < String > ( )
70
+ quotedMessageMapping = [ String: ChatMessage] ( )
71
+ }
72
+
73
+ // MARK: - private
74
+
75
+ private func userDisplayInfo( for message: ChatMessage ) -> UserDisplayInfo ? {
76
+ if let userId = messageAuthorMapping [ message. id] ,
77
+ let userDisplayInfo = messageAuthors [ userId] {
78
+ return userDisplayInfo
79
+ } else {
80
+ return nil
81
+ }
82
+ }
83
+
61
84
private func saveUserDisplayInfo( for message: ChatMessage ) -> UserDisplayInfo {
62
85
let user = message. author
63
86
let userDisplayInfo = UserDisplayInfo (
64
87
id: user. id,
65
88
name: user. name ?? user. id,
66
89
imageURL: user. imageURL
67
90
)
68
- messageAuthorMapping [ message. id] = userDisplayInfo
91
+ messageAuthorMapping [ message. id] = user. id
92
+ messageAuthors [ user. id] = userDisplayInfo
69
93
70
94
return userDisplayInfo
71
95
}
0 commit comments