- import UIKit
//导入Rx相关框架 - import RxSwift
- import RxCocoa
- struct Music {
- let name:String
- let singer:String
-
- init(name:String,singer:String) {
- self.name = name
- self.singer = singer
- }
- }
- extension Music:CustomStringConvertible{
- var description: String {
- return "name:\(name) singer:\(singer)"
- }
- }
- struct MusicListModel {
- /*
- 这里我们将 data 属性变成一个可观察序列对象(Observable Squence),
- 而对象当中的内容和我们之前在数组当中所包含的内容是完全一样的。
- 关于可观察序列对象在后面的文章中我会详细介绍。
- 简单说就是“序列”可以对这些数值进行“订阅(Subscribe)”,有点类似于“通知(NotificationCenter)”
- */
- let data = Observable.just([
- Music(name: "无条件", singer: "陈奕迅"),
- Music(name: "你曾是少年", singer: "S.H.E"),
- Music(name: "从前的我", singer: "陈洁仪"),
- Music(name: "在木星", singer: "朴树")
- ])
- }
- /*
- 这里我们不再需要实现数据源和委托协议了。而是写一些响应式代码,让它们将数据和 UITableView 建立绑定关系。
- */
-
- class ViewController: UIViewController {
- @IBOutlet weak var tableView: UITableView!
- /*
- DisposeBag:作用是 Rx 在视图控制器或者其持有者将要销毁的时候,自动释法掉绑定在它上面的资源。
- 它是通过类似“订阅处置机制”方式实现(类似于 NotificationCenter 的 removeObserver)。
- */
- let disposeBag = DisposeBag()
- let musicArray = MusicListModel()
-
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- //将数据源数据绑定到tableView上
- /*
- rx.items(cellIdentifier:):这是 Rx 基于 cellForRowAt 数据源方法的一个封装。
- 传统方式中我们还要有个 numberOfRowsInSection 方法,使用 Rx 后就不再需要了(Rx 已经帮我们完成了相关工作)。
- */
- musicArray.data.bind(to: tableView.rx.items(cellIdentifier:"musicCell")) { _, music, cell in
- cell.textLabel?.text = music.name
- cell.detailTextLabel?.text = music.singer
- }.disposed(by: disposeBag)
-
- //tableView点击响应
- /*
- rx.modelSelected: 这是 Rx 基于 UITableView 委托回调方法 didSelectRowAt 的一个封装。
- */
- tableView.rx.modelSelected(Music.self).subscribe(onNext: { music in
- print("你选中的歌曲信息【\(music)】")
- }).disposed(by: disposeBag)
-
- }
-
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- }