美文网首页
初识RxSwift

初识RxSwift

作者: 张义飞 | 来源:发表于2018-03-07 07:25 被阅读0次

RxSwift

RxSwift核心概念

  • 我们通过一张图来理解RxSwift,它主要有几个关键的概念Observable(可被观察的对象),Operators(操作符),Observer(观察者)
rxswift.jpg

RxSwift把任何事物都看作是可观察的序列(使用泛型),比如一个数组,一个变量,-个函数,一个网络请求等。这样我们就可以把任何事物放到可被观察序列中去,然后经过operators转换成我们想要的数据,通过和观察者进行绑定,观察者就能观测到可被观察者序列中的数据流变化。

RxSwift简单的几个例子

  • 通过create创建一个可观察序列
Observable<String>.create(_ subscribe: @escaping (AnyObserver<String>) -> Disposable) -> Observable<String>

我们看到这里有三个对象Observable(可观察者序列),AnyObserver(观察者), Disposable(用来管理声明周期的),我们需要一个闭包,这个闭包的签名是(observer)=> Disposable.

_ = Observable<String>.create { (observer) -> Disposable in
    observer.on(.next("4"))
    observer.on(.next("5"))
    observer.on(.completed)
    return Disposables.create()
}
  • 通过subscribe进行订阅
func subscribe(_ on: @escaping (Event<String>) -> Void) -> Disposable

Event是一个枚举类型,.next进行下一步,.error出错了,.completed完成了序列。这样我们就可以订阅刚才的可被观察者序列了。

_ = Observable<String>.create { (observer) -> Disposable in
    observer.on(.next("4"))
    observer.on(.next("5"))
    observer.on(.completed)
    return Disposables.create()
    }.subscribe({ (event) in
        print(event.element)
    })

这样可被观察序列发出的数据,都能被我们接收到了。

RxSwift在iOS中的应用

  • target action

传统的target action

self.button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)

func butonTapped() {
    print("button点击事件")
}

rxswift的taret action

self.button.rx.tap
    .subscribe(onNext: {
        print("监听button点击事件")
    })
    .disposed(by: disposeBag)

我们看到两段代码在结构上明显下面更容易读,和理解。

  • 代理的使用

传统写法

class ViewController: UIViewController {
    ...
    override func viewDidLoad() {
        super.viewDidLoad()
        self.scrollView.delegate = self
    }
}

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print("contentOffset: \(self.scrollView.contentOffset)")
    }
}

RxSwift的写法

class ViewController: UIViewController {
    ...
    override func viewDidLoad() {
        super.viewDidLoad()

        self.scrollView.rx.contentOffset
            .subscribe(onNext: { contentOffset in
                print("contentOffset: \(contentOffset)")
            })
            .disposed(by: disposeBag)
    }
}
  • 闭包回调

传统写法

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写法

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)
  • 通知

传统写法

var ntfObserver: NSObjectProtocol!

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

传统写法

private var observerContext = 0

override func viewDidLoad() {
    super.viewDidLoad()
    user.addObserver(self, forKeyPath: #keyPath(User.name), options: [.new, .initial], context: &observerContext)
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if context == &observerContext {
        let newValue = change?[.newKey] as? String
        print("do something with newValue")
    } else {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
    }
}

deinit {
    user.removeObserver(self, forKeyPath: #keyPath(User.name))
}

RxSwift写法

override func viewDidLoad() {
    super.viewDidLoad()

    user.rx.observe(String.self, #keyPath(User.name))
        .subscribe(onNext: { newValue in
            print("do something with newValue")
        })
        .disposed(by: disposeBag)
}

相关文章

  • 初识RxSwift

    RxSwift RxSwift核心概念 我们通过一张图来理解RxSwift,它主要有几个关键的概念Observab...

  • RxSwift 初识

    RxSwift 中的 Observable 是观察者模式中被观察到对象,相当于一个事件序列,会主动向订阅者发送新产...

  • RxSwift初识

    ReactiveX和RxSwift ReactiveX: Rx 是一个可以帮助我们简化异步编程的框架。RxSwif...

  • RxSwift(1)-初识RxSwift

    简介 Rx简介 RxSwift是Rx家族对swift语言的封装。什么是Rx呢?全称是ReactiveX。官方对自己...

  • RxSwift学习基础篇

    1.RxSwift初识 RxSwift是 ReactiveX 的swift版本,是一种函数式响应编程的框架。RxS...

  • RxSwift-初识

    RxSwift简介 ReactiveX(简写:Rx 全写:Reactive Extension)是一个可以帮助我们...

  • 01.RxSwift-初识

    作为一个iOS开发人员, 当Swift遇上了RxSwift --> 函数响应式编程,在没有认识RxSwift之前,...

  • RxSwift-Observable初识

    Observable三步曲 使用 源码解析 创建序列 Observable的create创建了AnonymousO...

  • RxSwift-Observable-interval初识

    Observable的interval可以产生一个计时器,并且这个计时器不熟Runloop影响,那它究竟是何方神圣...

  • 理解 RxSwift:实现原理(二)

    理解 RxSwift:为什么要使用 RxSwift(一) 理解 RxSwift:实现原理(二) RxSwift 内...

网友评论

      本文标题:初识RxSwift

      本文链接:https://www.haomeiwen.com/subject/wzvdfftx.html