Mvvm 在TableView中正确使用RxSwift

Mvvm 在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

我不知道如何在ModelView和ViewController之间传输数据。在

选择ModelViewController

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