Невозможно отправить данные другому модулю в VIPER
Как я могу отправить данные из модуля A в модуль B в VIPER? Я использую маршрутизатор A, который имеет информацию для модуля B, и пытаюсь отправить эту информацию для просмотра контроллера B или докладчика B. Каков наилучший способ сделать это?
3 ответа
В этом случае мой рабочий процесс:
- Обычно пользовательский интерфейс (
view
) в модуле A запускает событие, которое вызывает модуль B. - Событие достигает
presenter
в модуле А.presenter
знает, что должен изменить модуль и уведомляетwireframe
кто знает, как внести изменения. wireframe
в модуле А уведомляетwireframe
в модуле B. При этом вызове отправляет все необходимые данныеwireframe
в модуле B продолжает свое нормальное выполнение, передавая информациюpresenter
wireframe
в модуле А должен знатьwireframe
В
Используйте делегатов для отправки данных между модулями VIPER:
// 1. Declare which messages can be sent to the delegate
// ProductScreenDelegate.swift
protocol ProductScreenDelegate {
//Add arguments if you need to send some information
func onProductScreenDismissed()
func onProductSelected(_ product: Product?)
}
// 2. Call the delegate when you need to send him a message
// ProductPresenter.swift
class ProductPresenter {
// MARK: Properties
weak var view: ProductView?
var router: ProductWireframe?
var interactor: ProductUseCase?
var delegate: ProductScreenDelegate?
}
extension ProductPresenter: ProductPresentation {
//View tells Presenter that view disappeared
func onViewDidDisappear() {
//Presenter tells its delegate that the screen was dismissed
delegate?.onProductScreenDismissed()
}
}
// 3. Implement the delegate protocol to do something when you receive the message
// ScannerPresenter.swift
class ScannerPresenter: ProductScreenDelegate {
//Presenter receives the message from the sender
func onProductScreenDismissed() {
//Presenter tells view what to do once product screen was dismissed
view?.startScanning()
}
...
}
// 4. Link the delegate from the Product presenter in order to proper initialize it
// File ScannerRouter.swift
class ProductRouter {
static func setupModule(delegate: ProductScreenDelegate?) -> ProductViewController {
...
let presenter = ScannerPresenter()
presenter.view = view
presenter.interactor = interactor
presenter.router = router
presenter.delegate = delegate // Add this line to link the delegate
...
}
}
Дополнительные советы можно найти в этом сообщении https://www.ckl.io/blog/best-practices-viper-architecture/
Есть ли в каркасе ссылка на докладчика? Эта версия VIPER, которую я использую
Маршрутизатор знает о другом модуле и сообщает view, чтобы открыть его. Сборка объединяет все части модуля.