Mvvm 在TableView中正确使用RxSwift
我不知道如何在ModelView和ViewController之间传输数据。在 选择ModelViewControllerMvvm 在TableView中正确使用RxSwift,mvvm,swift3,tableview,rx-swift,Mvvm,Swift3,Tableview,Rx Swift,我不知道如何在ModelView和ViewController之间传输数据。在 选择ModelViewController class SelectModelViewController: UIViewController { @IBOutlet weak var tableView: UITableView! @IBOutlet weak var errorLabel: UILabel! @IBOutlet weak var activityIndicator: UIActivityIndi
class SelectModelViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var errorLabel: UILabel!
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
var markViewModel : MarkViewModel?
let markService = MarkService()
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
markViewModel = MarkViewModel(markService: markService)
markViewModel?.data.asObservable()
.bindTo(tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (_, element, cell) in
cell.textLabel?.text = element
}
.addDisposableTo(disposeBag)
}
}
MarkViewModel有一个错误。我做错了什么事
结构MarkViewModel{
let markService: MarkService
var data: Driver<[Mark]>
init(markService: MarkService) {
self.markService = markService
data = markService.get()
.map { result in
switch result {
case.success(let marks):
return marks.map { mark in
return mark
}
case .error(let error):
print(error)
}
}.asDriver(onErrorJustReturn: .error(.other))
}}
let markService:markService
var数据:驱动程序
初始化(markService:markService){
self.markService=markService
data=markService.get()
.map{导致
切换结果{
成功案例(让分数):
return marks.map{mark in
返回标记
}
案例错误(let error):
打印(错误)
}
}.asDriver(onErrorJustReturn:。错误(.other))
}}
MarkService
结构标记服务{
func get() -> Observable<Result<[Mark]>> {
return URLSession.shared.rx.json(url: URL(string: API.BaseURL)!)
.retry(3)
.map {
var marks = [Mark]()
guard let json = $0 as? [String: Any],
let items = json["RBMarks"] as? [[String : Any]] else {
return .error(.badJSON)
}
for item in items {
if let mark = Mark(json: item) {
marks.append(mark)
} else {
return .error(.badJSON)
}
}
return .success(marks)
}
.catchErrorJustReturn(.error(.noInternet))
}}
func get()->可观察{
返回URLSession.shared.rx.json(url:url(string:API.BaseURL)!)
.重试(3)
.地图{
变量标记=[Mark]()
guard let json=$0作为?[String:Any],
将items=json[“RBMarks”]设为?[[String:Any]]其他{
return.error(.badJSON)
}
对于项目中的项目{
如果let mark=mark(json:item){
标记。附加(标记)
}否则{
return.error(.badJSON)
}
}
返回。成功(分数)
}
.catchErrorJustReturn(.error(.noInternet))
}}
首先,我们可以从MarkService
返回Observable
,而不是Any
。这将有助于以后显示它们
struct MarkService {
func get() -> Observable<Result<[Mark]>> {
return URLSession.shared.rx.json(url: URL(string: API.BaseURL)!)
.retry(3)
.map {
var marks = [Mark]()
guard let json = $0 as? [String: Any],
let items = json["RBMarks"] as? [[String : Any]] else {
return .error(.badJSON)
}
for item in items {
if let mark = Mark(json: item) {
marks.append(mark)
} else {
return .error(.badJSON)
}
}
return .success(marks)
}
.catchErrorJustReturn(.error(.noInternet))
}
}
现在,在视图控制器中,我们可以使用RxSwift的表视图绑定来显示这些数据
let disposeBag = DisposeBag()
func viewDidLoad() {
viewModel.data
.bindTo(tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (_, element, cell) in
cell.textLabel?.text = element
}
.addDisposableTo(disposeBag)
}
这显然只是一个示例,说明了如何执行此操作,并且代码将根据特定视图的要求而变化。您应该尝试提供一些详细信息,说明此操作不起作用的原因。出了什么问题?您期望发生什么?@StefanDorunga我只是不明白如何在ModelView和ViewController之间传输数据谢谢您的回复!我正在从
MarkService
返回处理程序错误的通用枚举结果。如果MarkService
将返回Result
该代码会是什么样子Result
的优点实际上是我可以保存一个类型或一个错误。因此,无需在此处使用Any
。但是如果确实需要,您需要将视图控制器中的guard
更改为guard case.success(let anyMarks)=result,let marks=anyMarks as?[Mark]否则{
我编辑了这个问题,我在viewModel中有一个错误无法将'SharedSequence'类型的值赋给'SharedSequence'(也称为'SharedSequence')”
在视图模型中,替换案例。错误(let error):用案例打印(error)
。错误(let error):抛出错误
。
let disposeBag = DisposeBag()
func viewDidLoad() {
viewModel.data
.bindTo(tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (_, element, cell) in
cell.textLabel?.text = element
}
.addDisposableTo(disposeBag)
}