gpt4 book ai didi

json - Rx swift : MVVM Update Struct on View Model and Trigger Table Update on View Controller

转载 作者:行者123 更新时间:2023-11-28 05:46:37 24 4
gpt4 key购买 nike

我目前正在研究 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 解析为结构(具有嵌套结构)并返回结构?

-> ViewModel 获取结构?并打开它,为 UI 设置做好准备。

-> ??

我的问题在'??'是为了通知 VC menu 已更新,以便设置 TableView。有什么建议么?我试过将 PublishSubjects、BehaviorSubject 与 observables 结合使用,但我似乎无法让它发挥作用。我怀疑它是语法还是与后台流程相关的东西......

提前致谢!P.s - 如果需要更多信息,我可以很乐意提供,我只是不想写一篇很长的帖子:p

最佳答案

我没有在您的代码中找到任何关于数据绑定(bind)的代码。通常,如果你使用 RxSwift,你应该创建一个数据序列并绑定(bind)到你的 View 。对于 TableView 或 Collection View ,我们喜欢使用 RxDataSource

  1. 创建一个 Observable 从服务器获取响应
  2. 使用map 转换数据
  3. 将数据绑定(bind)到您的 View

在你的情况下,你应该定义一个函数来从服务器获取菜单模型

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

声明一个 Observable

let menuModelObservable: Observable<MenuModel>

init() {
menuModelObservable = getMenuModel()
}

将数据绑定(bind)到您的 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)
}

关于json - Rx swift : MVVM Update Struct on View Model and Trigger Table Update on View Controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54443295/

24 4 0