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.

messageController  .messageChangePublisher  .sink(receiveValue: {  // Process the changes in the message here  })  .store(in: &cancellables)

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  } } 
© Getstream.io, Inc. All Rights Reserved.