RxSwift:视图模型上的MVVM更新结构和视图控制器上的触发器表更新

时间:2019-01-30 14:49:44

标签: json swift asynchronous tableview rx-swift

我目前正在深入研究RxSwift,并且尝试使用它来更新ViewController(.xib)上的TableView以及我从JSON获得的数据,并使用Codable对其进行编码。

这是我的VM atm:

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从URL请求JSON并返回数据?

->中间层使用Codable将JSON解析为Struct(具有嵌套结构)并返回Struct?

-> ViewModel获取结构?并解开它,准备好进行UI设置。

-> ??

我的问题在“ ??”是为了通知VC 菜单已更新,以便设置TableView。有什么建议么?我已经尝试过将PublishSubjects,BehaviorSubject与Observable结合使用,但是我似乎无法使其工作。我不确定这是语法还是与背景流程有关的东西...

提前谢谢! 附言:如果需要更多信息,我可以很乐意提供,我只是想不想发表太长的帖子:p

1 个答案:

答案 0 :(得分:1)

在您的代码中找不到任何有关数据绑定的代码。通常,如果您使用的是RxSwift,则应创建一个数据序列并绑定到视图。对于表视图或集合视图,我们喜欢使用reflexive closure

  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)
}