messageController
.messageChangePublisher
.sink(receiveValue: {
// Process the changes in the message here
})
.store(in: &cancellables)
Message Controllers
MessageController
ChatMessageController
allows you to observe and mutate data and observing changes for one message and its replies.
Publishers in ChatMessageController
The messageChangePublisher
emits a new value every time the message changes.
The repliesChangesPublisher
emits a new value every time the list of the replies of the message has some changes.
messageController
.repliesChangesPublisher
.sink(receiveValue: {
// Process the changes to message replies here
})
.store(in: &cancellables)
Example: Message Detail
class MessageDetailView: UIView {
var message: ChatMessage! {
didSet {
updateContent()
}
}
var labelView: UILabel = {
var label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override public init(frame: CGRect) {
super.init(frame: frame)
addSubview(labelView)
NSLayoutConstraint.activate([
labelView.topAnchor.constraint(equalTo: topAnchor),
labelView.bottomAnchor.constraint(equalTo: bottomAnchor),
labelView.leadingAnchor.constraint(equalTo: leadingAnchor),
labelView.trailingAnchor.constraint(equalTo: trailingAnchor)
])
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
func updateContent() {
let messageText = message?.text ?? ""
let repliesCount = message?.replyCount ?? 0
labelView.text = "Text: \(messageText) Replies: \(repliesCount)"
}
}
class ViewController: UIViewController {
var controller: ChatMessageController!
var cancellables: Set<AnyCancellable> = []
var messageDetailView: MessageDetailView = {
var view = MessageDetailView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
let cid = ChannelId(type: .messaging, id: "E9BF5FCE-1")
controller = ChatClient.shared.messageController(cid: cid, messageId: "91AC67C6-C2AF-486E-8552-08E6F9B48D85")
controller.synchronize { error in
if error != nil {
log.assertionFailure(error!)
return
}
/// set the initial state to the view
self.messageDetailView.message = self.controller.message
}
controller.messageChangePublisher.receive(on: RunLoop.main).sink { [weak self] messageChange in
print("Message changed!")
self?.messageDetailView.message = self?.controller.message
}.store(in: &cancellables)
controller.repliesChangesPublisher.receive(on: RunLoop.main).sink { [weak self] messageChange in
print("Replies changed!")
self?.messageDetailView.message = self?.controller.message
}.store(in: &cancellables)
navigationItem.titleView = messageDetailView
}
}