RxSwift

2023-12-19  本文已影响0人  张_何
常用方式简单体验
testBtn.rx.tap.subscribe{ (event : Event<()>) in
   print("按钮发生了点击");
}

对于订阅事件需要返回值,而我们没有写返回值的警告,我们可以定义一个 DisposeBag 的变量来,并添加到订阅后来解决, 比如上面的代码我们只做了打印,并没有返回值,这是会有个警告提示,那么我们就可以通过这种方式解决

fileprivate lazy var bag: DisposeBag = DisposeBag()
testBtn.rx.tap.subscribe{ (event : Event<()>) in
   print("按钮 1 发生了点击");
}.addDisposeableTo(bag)

对于使用 RxSwift 中没提示的问题,可以先定义一个局部变量,使用局部变量将方法点出来之后再复制,比如上面的代码testBtn1.rx.tap.的时候点不出来了,就可以定义一个局部变量let btn = UIButton(),使用 btn.rx.tap.出来要用的方法,然后复制粘贴

textField.rx.text.subscribe{ (event : Event<String ?>) in
  print(event.element!!) // 这里 event 是一个 Next 值
}.addDisposeableTo(bag)
// 或者
textField.rx.text.subscribe( onNext: {(str: String? ) in
  print(str!)
}).addDisposeableTo(bag)
textField.rx.text.bindTo(textLable1.rx.text).addDisposeableTo(bag)
testLabel.rx.observe(String.self, "text").subscribe(onNext:{(str: String?) in
print(str!)
}).addDisposeableTo(bag)
scrollView.contentSize = CGSize(width: 10000, height: 200)
scrollView.rx.contentOffset.subscribe(onNext:{(point: CGPoint) in
print(point)
}).addDisposeableTo(bag)
常见操作
let never = Observable<String>.never()
never.subscribe{(event : Event<String>) in
 print(event)
}.addDisposeableTo(bag)
let empty = Observable<String>.empty()
empty.subscribe{(event : Event<String>) in
 print(event) // 这里会打印一次 completed 事件
}.addDisposeableTo(bag)
let just = Observable.just("张三")
just.subscribe{(event : Event<String>) in
 print(event) // 这里会打印两次,一次 Next 事件,一次 completed 事件
}.addDisposeableTo(bag)
let oftest = Observable.of("a","b","c","d")
oftest.subscribe{(event : Event<String>) in
 print(event) // 这里会打印五次,四次 Next 事件一次输出a,b,c,d 和 一次 completed 事件
}.addDisposeableTo(bag)
let fromtest = Observable.from([1,2,3,4])
fromtest.subscribe{(event : Event<Int>) in
 print(event) // 这里会打印五次,四次 Next 事件一次输出1,2,3,4 和 一次 completed 事件
}.addDisposeableTo(bag)
let create = Observable.create({(observer : AnyObserver<Any>) -> Disposable in 
  observer.onNext("zhangsan")
  observer.onNext(18)
  observer.onNext(1.8)
  observer.onCompleted()
  return Disposable.create()
})
let range = Observable.range(start:1, count:10)
range.subscribe{(event : Event<Int>) in
 print(event) // 这里会打印十一次,十次 Next 事件,一次 completed 事件
}.addDisposeableTo(bag)
let repeat = Observable.repeatElement("hello world")
repeat.subscribe{(event : Event<String>) in
 print(event) // 这里会一直重复打印next 事件 next(hello world)
}.addDisposeableTo(bag)
// 如果需要执行次数,需要先使用 repeat.take(count: Int) 方法指定次数
repeat.take(4).subscribe{(event : Event<String>) in
 print(event) // 这里会一直重复打印next 事件 next(hello world)
}.addDisposeableTo(bag)
Subjects
let publishSubject = PublishSubject<String>()
publishSubject.onNext("18"); // 发送的这个 onNext 事件,下面的订阅收不到,因为发生在订阅之前
publishSubject.subscribe{(event : Event<String>) in
  print(event)
}.addDisposeableTo(bag)
publishSubject.onNext("张三");
let replaySubject = ReplaySubject<String>.create(bufferSize:2)
replaySubject.onNext("a"); 
replaySubject.onNext("b"); 
replaySubject.onNext("c"); 
replaySubject.subscribe{(event : Event<String>) in
  print(event) // 会接受到 b,c,d
}.addDisposeableTo(bag)
replaySubject.onNext("d"); 
let behaviorSub = BehaviorSubject(value:"a")
behaviorSub.onNext("b"); 
behaviorSub.onNext("c"); 
behaviorSub.onNext("d"); 
behaviorSub.subscribe{(event : Event<String>) in
  print(event) // 会接收到 d,e,f,g
}.addDisposeableTo(bag)
behaviorSub.onNext("e"); 
behaviorSub.onNext("f"); 
behaviorSub.onNext("g"); 
let variable = Variable("a")
variable.asObserver().subscribe{(event : Event<String>) in 
  print(event) // 会接收到 a,b,c
}.addDisposeableTo(bag)
variable.value = 'b'
variable.value = 'c'
资源回收
let variable = Variable("a")
variable.asObserver().subscribe{(event : Event<String>) in 
  print(event) // 会接收到 a,  
}.dispose()
variable.value = 'b'
variable.value = 'c'
UIBindingObserver
extension Reactive where Base: UITextField{
  var inputEnable: UIBindingObserver<Base, Result>{
    return UIBindingObserver(UIElement: base) { textField, result in
      textField.isEnabled = result.isValid
    }
  }
}
上一篇 下一篇

猜你喜欢

热点阅读