У меня есть родитель UIViewController
, у него есть собственная модель представления, объявленная как
lazy var chatService: ChatService = {
let chatService = ChatService()
return chatService
}()
lazy var viewModel: ChatControllerViewModel = {
let viewModel = ChatControllerViewModel(chatService: chatService)
return viewModel
}()
Этот контроллер вида имеет UITableView
, объявленный как
lazy var tableView: UITableView = {
let tableView = UITableView(frame: .zero)
return tableView
}()
Внутри viewDidLoad
У меня есть привязка как таковая
viewModel.reloadData = { [weak self] in
self?.insertNewMessage()
}
Это вызывает следующий метод
fileprivate func insertNewMessage() {
let indexPath = IndexPath(row: viewModel.history.count - 1, section: 0)
tableView.beginUpdates()
tableView.insertRows(at: [indexPath], with: .fade)
tableView.endUpdates()
tableView.scrollToRow(at: indexPath, at: .bottom, animated: true)
}
Это работает отлично. У меня также есть дочерний контроллер вида, который имеет тип UICollectionViewController
, объявленный как
lazy var chatQuestionsCollectionView: ChatQuestionsController = {
let layout = SnappingCollectionViewLayout()
let cv = ChatQuestionsController(collectionViewLayout: layout)
return cv
}()
У этого UICollectionViewController
есть собственная модель вида, настроенная так же, как указано выше.
Все это хорошо работает до определенной степени;
My ChatControllerViewModel
вызывает ChatService и запрашивает последние сообщения, затем они отправляются из ChatService в мою модель просмотра как таковую
ChatService
var pushResponse: ((_ response: ChatMessage) -> Void)?
ChatControllerViewModel
init(chatService: ChatService = ChatService()) {
self.chatService = chatService
chatService.pushResponse = { [weak self] response in
self?.chatHistory.append(response)
}
}
Это отправляет новое сообщение на мой UITableView
, а затем перезагружает данные, отображая сообщение.
Однако, мой дочерний контроллер представления, тогда UICollectionView
также говорит с ChatService
- он содержит серию горизонтальных прокручиваемых кнопок, которые вызывают ответ.
При нажатии кнопки я вижу в журнале, что моя служба чата вызывается, логика работает, как и ожидалось, однако в тот момент, когда служба чата вызывает var pushResponse: ((_ response: ChatMessage) -> Void)?
, мой контроллер представления не обновляется.
Я подозреваю, что это потому, что мой UICollectionView взаимодействует с другим экземпляром ChatService
, для которого не установлена эта привязка.
Это звучит правдоподобно? Если это так, что будет правильным способом отрицать эту проблему? Я подумал об использовании шаблона делегата, но не уверен, что мне следует делегировать и куда.
Чтобы придать контекст макету:
У меня есть табличное представление, представляющее сообщения чата по вертикали.
В нижней части окна у меня есть представление коллекции, представляющее кнопки, которые прокручиваются горизонтально.
Нажатие этих кнопок вызывает службу чата, которая, в свою очередь, должна вызвать привязку с моделью представления табличного представления, которая должна перезагрузить представление таблицы с новыми данными.