import UIKit
import RxSwift
import RxCocoa
//7.拓展Binder属性
extension Reactive where Base: UIView {
var hidden: Binder<Bool> {
return Binder<Bool>(base) { button, value in
button.isHidden = value
}
}
}
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var button: UIButton!
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var slider: UISlider!
@IBOutlet weak var tableView: UITableView!
let bag = DisposeBag()
let persons = Observable.just([
Person(name: "Jack", age: 20),
Person(name: "Rose", age: 25),
Person(name: "Kate", age: 30)
])
override func viewDidLoad() {
super.viewDidLoad()
/*
1.响应式编程
a.响应式编程RP Reactive Programming,也是一种编程范式,于1997年提出,可以简化异步编程,提供更优雅的数据绑定,一般与函数式融合在一起,所以也会叫做函数响应式编程Functional Reactive Programming简称FRP。
b.比较著名的、成熟的响应式框架
ReactiveCocoa,简称RAC,有OC、swift版本。
c.ReactiveX简称Rx,有众多编程语言的版本,比如RXJava、RXKotlin、RXJS、RxCpp、RxPHP、RxGo、RxSwift等等
2.RXSwift
a.RxSwift(ReactiveX for Swift),ReactiveX的Swift版本。
//中文文档:https://beeth0ven.github.io/RxSwift-Chinese-Documentation/
b.RxSwift的GitHub已经有详细的安装过程,这里只演示CocoaPods方式的安装
(1)Podfile
target 'RXSwiftTest' do
pod 'RxSwift','~>5'
pod 'RxCocoa','~>5'
end
c.模块说明
RxSwift:Rx标准API的swift实现,不包括任何iOS相关的内容。
RxCocoa:基于RxSwift,给iOSUI控件拓展了很多Rx特性.
3.RxSwift的核心角色
Observable:负责发送事件Event。
Observer:负责订阅Observable,监听Observable发送的事件Event
public enum Event<Element> { //3种Event
/// Next element is produced.
case next(Element) //携带具体数据
/// Sequence terminated with an error.
case error(Swift.Error) //携带错误信息,表明Observable终止,不会再发出事件
/// Sequence completed successfully.
case completed //表明Observable终止,不会再发出事件
}
*/
//4.创建、订阅Observable1
func test1() {
var observable = Observable<Int>.create { observer in
observer.onNext(1)
observer.onCompleted()
return Disposables.create()
}
//等价于
observable = Observable.just(1)
observable = Observable.of(2)
observable = Observable.from([3])
_ = observable.subscribe {
print("next", $0)
} onError: {
print("error", $0)
} onCompleted: {
print("onCompleted")
} onDisposed: {
print("Disposed")
}.disposed(by: bag) //当bag销毁deinit时,会自动调用Disposable实例的dispose,VC销毁时bag才销毁
// disposable.dispose() 可以在touchbegan取消掉
/*
next 3
onCompleted
Disposed
*/
}
test1()
func test2() {
var observable = Observable<Int>.create { observer in
observer.onNext(1)
observer.onNext(2)
observer.onNext(3)
observer.onCompleted()
return Disposables.create()
}
//等价于
observable = Observable.of(1, 2, 3)
observable = Observable.from([1, 2, 3])
//observable.takeUntil(self.rx.deallocated).subscribe self销毁(deinit)时,会自动调用Disposable实例的dispose
observable.subscribe { event in
print(event)
}.dispose() //立即取消订阅,只订阅一次
/*
next(1)
next(2)
next(3)
completed
*/
}
test2()
//5.创建、订阅Observable2
func test3() {
let observable = Observable<Int>.timer(.seconds(2), period: .seconds(1), scheduler: MainScheduler.instance)
// observable.map { "数值是:\($0)" }.bind(to:label.rx.text)
let binder = Binder<Bool>(button) {
button, value in
button.isHidden = value
}
observable.map { $0 % 2 == 0 }.bind(to: binder).disposed(by: bag)
//等价 自己扩充的 //7.拓展Binder属性
observable.map { $0 % 2 == 0 }.bind(to: button.rx.hidden).disposed(by: bag)
//等价 系统的
observable.map { $0 % 2 == 0 }.bind(to: button.rx.isHidden).disposed(by: bag)
}
test3()
//6.创建Observer
func test4() {
let observer = AnyObserver<Int>.init { event in
switch event {
case .next(let data):
print(data)
case .completed:
print("completed")
case .error(let error):
print("error",error)
}
}
Observable.just(1).subscribe(observer).dispose()
let binder = Binder<String>(label) { label, text in
label.text = text
}
Observable.just(4).map {"数值是\($0)"}.subscribe(binder).dispose()
Observable.just(5).map {"数值是\($0)"}.bind(to: binder).dispose()
}
test4()
//8.传统的状态监听
/*
在开发中经常要对各种状态进行监听,传统的常见监听方案有KVO、Target-Action、Notification、Delegate、Block Callback,传统方案经常会出现错综复杂的依赖关系、耦合性较高,还需要编写重复的非业务代码
*/
//9.RxSwift的状态监听1 Target-Action
button.rx.tap.subscribe(onNext: {
print("按钮被点击了")
}).disposed(by: bag)
//绑定tableView
persons.bind(to: tableView.rx.items(cellIdentifier: "cell")) {
row, person, cell in
cell.textLabel?.text = person.name
cell.detailTextLabel?.text = "\(person.age)"
}.disposed(by: bag)
tableView.rx.modelSelected(Person.self).subscribe(onNext:{ person in
print("点击了", person.name)
}).disposed(by: bag)
//10.RxSwift的状态监听2 KVO
class Dog: NSObject {
@objc dynamic var name: String?
}
var dog = Dog()
dog.rx.observe(String.self, "name").subscribe(onNext: { name in
print("name is", name ?? "nil")
}).disposed(by: bag)
dog.name = "rose"
dog.name = "dddddd"
//Notification
NotificationCenter.default.rx.notification(UIApplication.willEnterForegroundNotification).subscribe(onNext: {
notification in
print("APP 进入后台",notification)
}).disposed(by: bag)
//11.既是Observable又是Observer:诸如UISlider.rx.value、UITextField.rx.text,它们是RxCocoa.ControlProperty类型
Observable.just(0.8).bind(to: slider.rx.value).disposed(by: bag)
slider.rx.value.map { "当前数值是:\($0)" }.bind(to: textField.rx.text).disposed(by: bag)
// textField.rx.text.subscribe(onNext:{ text in
// print("text is", text ?? "nil")
// }).disposed(by: bag)
//12.Disposable 上面有3个
}
}