我目前正在深入研究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
答案 0 :(得分:1)
在您的代码中找不到任何有关数据绑定的代码。通常,如果您使用的是RxSwift,则应创建一个数据序列并绑定到视图。对于表视图或集合视图,我们喜欢使用reflexive closure
Observable
响应map
转换数据在这种情况下,您应该定义一个函数来从服务器获取菜单模型
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)
}