返回 导航

Swift

hangge.com

Swift - RxSwift的使用详解66(检测当前值与初始值是否相同:isEqualOriginValue)

作者:hangge | 2018-06-13 08:10
    有时我们需要检查输入的最新值与最开始的值是否相同。比如页面上有一个文本输入框(textField),它带有一个默认值,当用户多次输入后,我们想要知道最终的结果与初始值相比是否发生了变化。
    通常的做法就是把初始值保存下来,每次值发生改变时都手动与初始值做个比较。但这样做还是略显麻烦,下面介绍个简单的办法。

一、扩展 ObservableConvertibleType

(1)为保证通用性,我们首先对 ObservableConvertibleType 进行扩展,增加一个 isEqualOriginValue 的方法。这样所有的可观察序列都可以使用这个方法实现来最新值与初始值的比较判断。
(2)该方法作用是将原始序列转化成新序列,新序列除了发出原始值外,同时还会附带上比较结果。
(3)该方法内部通过 scan map 操作符配合实现。
extension ObservableConvertibleType where E: Equatable {
    
    //将原始序列(当前值)转换成(当前值, 是否与最初值相同)的序列
    func isEqualOriginValue() -> Observable<(value: E, isEqualOriginValue: Bool)> {
        return self.asObservable()
            .scan(nil){ acum, x -> (origin: E, current: E)? in
                if let acum = acum {
                    return (origin: acum.origin, current: x)
                } else {
                    return (origin: x, current: x)
                }
            }
            .map { ($0!.current, isEqualOriginValue: $0!.origin == $0!.current) }
    }
}

二、使用样例

1,使用简单的序列进行测试

let disposeBag = DisposeBag()

Observable.of("a", "b", "c", "a", "e")
    .isEqualOriginValue()
    .subscribe(onNext: {
        print("当前值是:\($0.value)", "是否与除初始值相同:\($0.isEqualOriginValue)" )
    })
    .disposed(by: disposeBag)

2,使用文本输入框进行测试

      
import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //创建文本输入框
        let textField = UITextField(frame: CGRect(x:10, y:80, width:200, height:30))
        textField.text = "hangge"  //初始值设为:hangge
        textField.borderStyle = UITextBorderStyle.roundedRect
        self.view.addSubview(textField)
        
        //当文本框内容改变时,将内容输出到控制台上
        textField.rx.text.orEmpty.asObservable()
            .isEqualOriginValue()
            .subscribe(onNext: {
                print("当前值是:\($0.value)", "是否与除初始值相同:\($0.isEqualOriginValue)" )
            })
            .disposed(by: disposeBag)
    }
}

3,使用开关进行测试

         
import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //创建开关空间
        let uiswitch = UISwitch()
        uiswitch.center = CGPoint(x:100, y:100)
        uiswitch.isOn = true //设置默认值
        self.view.addSubview(uiswitch)
        
        //当开关状态改变时,将内容输出到控制台上
        uiswitch.rx.isOn.asObservable()
            .isEqualOriginValue()
            .subscribe(onNext: {
                print("当前值是:\($0.value)", "是否与除初始值相同:\($0.isEqualOriginValue)" )
            })
            .disposed(by: disposeBag)
    }
}
评论

全部评论(0)

回到顶部