Событие привязки не запускается, когда служба вызывается из другой модели представления - PullRequest
0 голосов
/ 10 января 2019

У меня есть родитель 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, для которого не установлена ​​эта привязка.

Это звучит правдоподобно? Если это так, что будет правильным способом отрицать эту проблему? Я подумал об использовании шаблона делегата, но не уверен, что мне следует делегировать и куда.

Чтобы придать контекст макету:

У меня есть табличное представление, представляющее сообщения чата по вертикали. В нижней части окна у меня есть представление коллекции, представляющее кнопки, которые прокручиваются горизонтально.

Нажатие этих кнопок вызывает службу чата, которая, в свою очередь, должна вызвать привязку с моделью представления табличного представления, которая должна перезагрузить представление таблицы с новыми данными.

1 Ответ

0 голосов
/ 10 января 2019

Вы создаете новый экземпляр ChatService в представлении своей коллекции, для которого не настроена привязка.

Если вы не хотите использовать Singleton, я бы создал его экземпляр в большинстве родительских компонентов и передал его через Внедрение зависимостей .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...