【发布时间】:2019-01-30 14:49:44
【问题描述】:
我目前正在深入研究 RxSwift,我正在尝试使用它来更新 ViewController(.xib) 上的 TableView,其中包含我从 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 从 URL 请求 JSON 并返回一个 Data?
-> 中间层使用 Codable 将 JSON 解析为 Struct(带有嵌套结构)并返回 Struct?
-> ViewModel 获取 Struct?并打开它,为 UI 设置做好准备。
-> ??
我在'??'的问题是通知 VC menu 已更新,以便设置 TableView。有什么建议么?我尝试过使用 PublishSubjects、BehaviorSubject 和 observables,但我似乎无法让它工作。我怀疑它是语法还是与后台流程相关的东西......
提前致谢! P.s - 如果需要更多信息,我可以很高兴地提供它,我只是想不发很长的帖子:p
【问题讨论】:
-
就目前而言,您的代码无法编译我不知道
menu应该是MenuModel?还是MenuModel。如果我将其设为非可选,那么您的guard let menu = menu将无法编译,因为您无法打开非可选的包装;如果我将其设为可选,则同一行将失败,因为缺少self。
标签: json swift asynchronous tableview rx-swift