Не могу отправить данные другому модулю в VIPER

objective-c viper

1638 просмотра

3 ответа

89 Репутация автора

Как я могу отправить данные из модуля A в модуль B в VIPER? Я использую маршрутизатор A, который имеет информацию для модуля B, и пытаюсь отправить эту информацию для просмотра контроллера B или докладчика B. Каков наилучший способ сделать это?

Автор: Yakimenko Aleksey Источник Размещён: 18.07.2016 08:04

Ответы (3)


6 плюса

915 Репутация автора

В этом случае мой рабочий процесс:

  1. Обычно пользовательский интерфейс ( view) в модуле A запускает событие, которое запускает модуль B.
  2. Событие достигает presenterвходного модуля A. Он presenterзнает, что он должен изменить модуль, и уведомляет, wireframeкто знает, как внести изменения.
  3. Модуль wireframein A уведомляет об этом wireframeв модуле B. При этом вызове отправляет все необходимые данные.
  4. Входной wireframeмодуль B продолжает свое нормальное выполнение, передавая информациюpresenter

wireframeв модуле A должен знать wireframeB

Автор: David Размещён: 27.07.2016 07:25

1 плюс

89 Репутация автора

Есть ли у каркаса ссылка на докладчика? Эта версия VIPER, которую я использую

Маршрутизатор знает о другом модуле и говорит представление , чтобы открыть его. Сборка объединяет все части модуля.

Автор: Yakimenko Aleksey Размещён: 28.07.2016 06:55

4 плюса

2285 Репутация автора

Используйте делегатов для отправки данных между модулями 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/

Автор: Marcelo Gracietti Размещён: 11.04.2017 02:00
Вопросы из категории :
32x32