飞道的博客

学习RXSwift之传统和Rx改在对比

501人阅读  评论(0)

RxSwift只是基于swift语言的Rx标准实现接口库,RxSwift不包含任何Cocoa或者UI方面的类

RxCocoa:是基于RxSwift针对IOS开发的一个库,它通过Extension的方法给原生UI控件增加R x特性,使得我们更容易订阅和响应这些控件的事件。

简单建立一个TableView


  
  1. //
  2. // ViewController.swift
  3. // LeanRxSwift
  4. //
  5. // Created by maochengfang on 2021/4/27.
  6. //
  7. import UIKit
  8. import RxSwift
  9. import Foundation
  10. struct Music {
  11. let name: String;
  12. let singer: String;
  13. init(name: String,singer: String) {
  14. self.name = name
  15. self.singer = singer
  16. }
  17. }
  18. extension Music : CustomStringConvertible{
  19. var description: String {
  20. return "name \(name) singer \(singer)"
  21. }
  22. }
  23. struct MusicDataModel {
  24. let data = [
  25. Music(name: "光年之外", singer: "摩登兄弟"),
  26. Music(name: "光年之外1", singer: "摩登兄弟1"),
  27. Music(name: "光年之外2", singer: "摩登兄弟2"),
  28. Music(name: "光年之外3", singer: "摩登兄弟3"),
  29. Music(name: "光年之外4", singer: "摩登兄弟4"),
  30. Music(name: "光年之外5", singer: "摩登兄弟5"),
  31. ]
  32. }
  33. class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
  34. let musicDataModel = MusicDataModel()
  35. var tableView: UITableView!
  36. let cellID = "testCellID"
  37. override func viewDidLoad() {
  38. super.viewDidLoad()
  39. // Do any additional setup after loading the view.
  40. self.tableView = UITableView(frame: CGRect(x: 0,y: 0,width: self.view.frame.size.width,height: self.view.frame.size.height), style: UITableView. Style.plain)
  41. self.tableView.delegate = self;
  42. self.tableView.dataSource = self;
  43. self.tableView.rowHeight = 50;
  44. self.tableView.register( UITableViewCell.classForCoder() , forCellReuseIdentifier: cellID)
  45. self.view.addSubview( self.tableView)
  46. }
  47. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  48. return musicDataModel.data. count
  49. }
  50. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  51. let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath)
  52. let music = musicDataModel.data[indexPath.row]
  53. cell.textLabel?.text = music.name
  54. cell.detailTextLabel?.text = music.singer
  55. return cell
  56. }
  57. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  58. print( "你选中的歌曲信息[\(musicDataModel.data[indexPath.row])]")
  59. }
  60. }

二、进行RX改造

001 将data的属性变成一个可观察序列对象,而对象中的内容不变


  
  1. //
  2. // ViewController.swift
  3. // LeanRxSwift
  4. //
  5. // Created by maochengfang on 2021/4/27.
  6. //
  7. import UIKit
  8. import RxSwift
  9. import RxCocoa
  10. import Foundation
  11. struct Music {
  12. let name: String;
  13. let singer: String;
  14. init(name: String,singer: String) {
  15. self.name = name
  16. self.singer = singer
  17. }
  18. }
  19. extension Music : CustomStringConvertible{
  20. var description: String {
  21. return "name \(name) singer \(singer)"
  22. }
  23. }
  24. struct MusicDataModel {
  25. let data = Observable.just([
  26. Music(name: "光年之外", singer: "摩登兄弟"),
  27. Music(name: "光年之外1", singer: "摩登兄弟1"),
  28. Music(name: "光年之外2", singer: "摩登兄弟2"),
  29. Music(name: "光年之外3", singer: "摩登兄弟3"),
  30. Music(name: "光年之外4", singer: "摩登兄弟4"),
  31. Music(name: "光年之外5", singer: "摩登兄弟5"),
  32. ])
  33. }
  34. class ViewController: UIViewController {
  35. let musicDataModel = MusicDataModel()
  36. var tableView: UITableView!
  37. let cellID = "testCellID"
  38. let disposeBag = DisposeBag()
  39. override func viewDidLoad() {
  40. super.viewDidLoad()
  41. // Do any additional setup after loading the view.
  42. self.tableView = UITableView(frame: CGRect(x: 0,y: 0,width: self.view.frame.size.width,height: self.view.frame.size.height), style: UITableView. Style.plain)
  43. self.tableView.rowHeight = 50;
  44. self.tableView.register( UITableViewCell.classForCoder() , forCellReuseIdentifier: cellID)
  45. self.view.addSubview( self.tableView)
  46. musicDataModel.data.bind(to: tableView.rx.items(cellIdentifier: cellID)){
  47. _,music, cell in cell.textLabel?.text = music.name
  48. cell.detailTextLabel?.text = music.singer
  49. }.disposed(by: disposeBag)
  50. tableView.rx.modelSelected( Music. self).subscribe(onNext: {music in print( "你选中的歌曲信息\(music)")}).disposed(by: disposeBag)
  51. }
  52. // func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  53. // return musicDataModel.data.count
  54. // }
  55. // func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  56. // let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath)
  57. // let music = musicDataModel.data[indexPath.row]
  58. // cell.textLabel?.text = music.name
  59. // cell.detailTextLabel?.text = music.singer
  60. // return cell
  61. //
  62. // }
  63. //
  64. // func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  65. // print("你选中的歌曲信息[\(musicDataModel.data[indexPath.row])]")
  66. // }
  67. }

 

DisposeBag:的作用是在Rx在视图控制器或者其持有者将要销毁的生活自动释放掉绑定它上面的资源,它是通过类似于订阅处理机制等方式实现

tableView.rx.items 这是Rx基于cellForRowAt数据源的封装,传统方式中还有一个numberOfRowsInSection方法,使用RX后就不需要了

tableView.rx.modelSelected 这是Rx基于didSelectRowAt的一个封装。

传统方式必须实现很多行代码,经过Rx改造之后,代码量会减少很多

 

 


转载:https://blog.csdn.net/Coding_Physical/article/details/116211678
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场