RxSwift: структура обновления MVVM для модели представления и обновление таблицы триггеров на контроллере представления - PullRequest
0 голосов
/ 30 января 2019

В настоящее время я погружаюсь в RxSwift и пытаюсь использовать его для обновления TableView на ViewController (.xib) данными, полученными из JSON и закодированными в структуру с помощью Codable.

Вот мой виртуальный банкомат:

import Foundation
import RxCocoa
import RxSwift

protocol MenuViewModelProtocol {
    func viewDidLoad()
}

class MenuViewModel: MenuViewModelProtocol {

    private (set) var menu = MenuModel()
    private let menuIntermediary = MenuDataIntermediary()

    func viewDidLoad() {
        debugPrint("MenuViewModel.viewDidLoad: Async request for menu was made")
        requestAndSetMenuToIntermediary { (_ success) in
            switch success {
            case true:
                debugPrint("MenuViewModel.requestAndSetMenuToIntermediary: Did get Menu successfully")
                // print(self.menu) // -> menu is here
            case false:
                debugPrint("MenuViewModel.requestAndSetMenuToIntermediary: Did not get Menu successfully")
            }
        }
    }

    private func requestAndSetMenuToIntermediary(completion: @escaping (_ success: Bool) -> Void) {
        menuIntermediary.jsonDataToMenuConversion { [weak self] (success) in
            DispatchQueue.global().async {
                guard let strongSelf = self else {
                    debugPrint("MenuViewModel.requestMenuToIntermediary: couldn't create a strong self reference")
                    completion(false)
                    return
                }

                guard let menu = menu else {
                    debugPrint("MenuViewModel.requestMenuToIntermediary: couldn't unwrap menu data")
                    completion(false)
                    return
                }
                strongSelf.menu = menu

                // print(strongSelf.menu) // -> menu is here
                completion(true)
            }
        }
    }
}

Поток данных requestAndSetMenuToIntermediary коротко:

-> DataManager запрашивает JSON из URL и возвращает данные?

-> Промежуточный слой анализирует JSON на Struct (с вложенными структурами), используя Codable, и возвращает Struct?

-> ViewModel получает структуру?и разворачивает его, будучи готовым к настройке пользовательского интерфейса.

-> ??

Моя проблема в '??'должен уведомить VC, что меню было обновлено, чтобы настроить TableView.Какие-либо предложения?Я пытался использовать PublishSubjects, BehaviorSubject в сочетании с наблюдаемыми, но я не могу заставить его работать.Я сомневаюсь, что это синтаксис или что-то, связанное с фоновым потоком ...

Заранее спасибо!Ps - если нужна дополнительная информация, я могу с радостью ее предоставить, я просто пытался не делать очень длинную запись: p

1 Ответ

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

Я не нахожу код привязки данных в вашем коде.Обычно, если вы используете RxSwift, вы должны создать последовательность данных и привязать ее к вашему представлению.Для табличного или коллекционного представления нам нравится использовать RxDataSource

  1. Создать Observable получение ответа от сервера
  2. Использование map для преобразования данных
  3. привязать данные к вашему представлению

В вашем случае вы должны определить функцию для получения модели меню с сервера

private func getMenuModel() -> Obserable<MenuModel> {
   /* the code getting response from server and transform to menu model */
}

Объявить наблюдаемый

let menuModelObservable: Observable<MenuModel>

init() {
   menuModelObservable = getMenuModel()
}

Привязать данные к вашему TableView

/* Your ViewController*/

override func viewDidLoad() {
    super.viewDidLoad()
    let viewModel = MenuViewModel()
    viewModel.menuModelObservable.bind(to: tableView.rx.items(cellIdentifier: "Cell")) { index, model, cell in
      cell.textLabel?.text = model
    }.disposed(by: disposeBag)
}

...