1. 程式人生 > >RxSwift之路01-----簡單的RxSwift使用

RxSwift之路01-----簡單的RxSwift使用

使用一年多swift後終於要入坑RxSwift了和在OC時代的ReactiveCocoa沒有多少差別,這裡先舉一些簡單的使用,可以減少程式碼的書寫,結構清晰
在不使用RxSwift時,我們寫button的事件時是這樣的

 override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(frame: CGRect(x: 40, y: 100, width: 70, height: 30))
        button.backgroundColor = UIColor.red
        button
.addTarget(self, action: #selector(buttonAction), for: UIControlEvents.touchUpInside) view.addSubview(button) } @objc func buttonAction(){ print("點選事件") }

使用RxSwift後代碼如下

   let button = UIButton(frame: CGRect(x: 40, y: 100, width: 70, height: 30))
        button.backgroundColor
= UIColor.red view.addSubview(button) button.rx.tap .subscribe(onNext: { print("Button Tap") }) .disposed(by: disposeBag)

從上面可以看出,控制元件的建立和事件的新增可以放在一起,是程式碼更加清晰明瞭

2.舉例2
建立一個UIScrollerView並實現它的代理事件,通常的寫法是建立一個extension單獨的管理代理方法的事件,種方法可以清晰的單獨的帶擴充套件中處理代理方法,看著非常的整潔,但是使用RxSwift後發現可以更簡單的處理這些事務邏輯
如下:

class ViewController: UIViewController {
 override func viewDidLoad() {
        super.viewDidLoad()
let scrollerView = UIScrollView(frame: CGRect(x: 10, y: 200, width: 200, height: 100))
        scrollerView.contentSize = CGSize(width: 200, height: 10000)
        scrollerView.backgroundColor = UIColor.orange
        scrollerView.delegate = self
        view.addSubview(scrollerView)
    }
 }
extension ViewController:UIScrollViewDelegate{
       func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        print(scrollView.contentOffset.y)
    }
}

上面的程式碼在滾動的時候就可以監聽到Y值
在使用RxSwift後就更簡單了

class ViewController: UIViewController {
    let disposeBag = DisposeBag()
 override func viewDidLoad() {
        super.viewDidLoad()
let scrollerView = UIScrollView(frame: CGRect(x: 10, y: 200, width: 200, height: 100))
        scrollerView.contentSize = CGSize(width: 200, height: 10000)
        scrollerView.backgroundColor = UIColor.orange
        view.addSubview(scrollerView)
scrollerView.rx.contentOffset
            .subscribe(onNext: { (content) in
               print(content.y)
            })
        .disposed(by: disposeBag)
    }
 }

舉例3

使用系統自帶的網路請求的方法

URLSession.shared.dataTask(with: URLRequest(url: url)) {
    (data, response, error) in
    guard error == nil else {
        print("Data Task Error: \(error!)")
        return
    }

    guard let data = data else {
        print("Data Task Error: unknown")
        return
    }

    print("Data Task Success with count: \(data.count)")
}.resume()

在使用RxSwift演示的程式碼的如下

 let url = URL(fileURLWithPath: "https://www.baidu.com/")
URLSession.shared.rx.data(request: URLRequest(url: url))
    .subscribe(onNext: { data in
        print("Data Task Success with count: \(data.count)")
    }, onError: { error in
        print("Data Task Error: \(error)")
    })
    .disposed(by: disposeBag)

舉例4.通知

override func viewDidLoad() {
    super.viewDidLoad()

    ntfObserver = NotificationCenter.default.addObserver(
          forName: .UIApplicationWillEnterForeground,
          object: nil, queue: nil) { (notification) in
        print("Application Will Enter Foreground")
    }
}

deinit {
    NotificationCenter.default.removeObserver(ntfObserver)
}

使用RxSwift演示演示程式碼如下

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.rx
        .notification(.UIApplicationWillEnterForeground)
        .subscribe(onNext: { (notification) in
            print("Application Will Enter Foreground")
        })
        .disposed(by: disposeBag)
}

從以上簡單的例子可以看出,使用RxSwift可以簡化部分程式碼,使程式碼結構更清晰,其他的後面在討論