在UITextField RxSwift上调用editDidEnd时出现重复事件

时间:2018-02-21 14:28:10

标签: rx-swift

我有一个文本字段,用于捕获用户'登录名。

  1. 用户点击文本字段内部。文本字段发出空字符串事件。
  2. 然后用户点击一些文字(" 123")。文本字段为每个字符发出一个事件。
  3. 然后用户点击另一个文本字段。文本字段发出一个事件,表示文本字段的最新状态(" 123")。
  4. 我想知道为什么文本字段会发出最后一个事件,并且有一种方法可以抑制最后一个事件。我尝试添加distinctUntilChanged,但这没有效果。我认为distinctUntilChanged不会触发最后一个事件,因为它与上一个事件相同。

    let userNameStream: Observable<String> = userNameText
      .rx
      .text
      .orEmpty
      .skip(1)
      .debug("userNameStream")
      .asObservable()
      .share(replay:1)
      .distinctUntilChanged()
    

    输出

    018-02-21 06:05:29.303: userNameStream -> Event next()
      userNameText : editingDidBegin
    2018-02-21 06:05:38.448: userNameStream -> Event next(1)
    2018-02-21 06:05:43.369: userNameStream -> Event next(12)
    2018-02-21 06:05:48.880: userNameStream -> Event next(123)
    2018-02-21 06:06:03.224: userNameStream -> Event next(123) // Duplicate Event!
      userNameText : editingDidEnd
    

2 个答案:

答案 0 :(得分:0)

debug运算符

之后移动distinctUntilChanged运算符
let userNameStream: Observable<String> = userNameText
  .rx
  .text
  .orEmpty
  .skip(1)
  .distinctUntilChanged()
  .debug("userNameStream")
  .asObservable()
  .share(replay:1)

答案 1 :(得分:0)

我正在使用: RxCocoa(4.1.2),RxSwift(4.1.2)

请尝试以下代码:

let disposeBag = DisposeBag()
userNameText
        .rx
        .text
        .orEmpty
        .distinctUntilChanged()
        .debug()
        .subscribe()
        .disposed(by: disposeBag)

日志

2018-02-22 11:47:21.618: ViewController.swift:26 (viewDidLoad()) -> subscribed
2018-02-22 11:47:21.620: ViewController.swift:26 (viewDidLoad()) -> Event next()
2018-02-22 11:47:29.560: ViewController.swift:26 (viewDidLoad()) -> Event next(a)
2018-02-22 11:47:30.046: ViewController.swift:26 (viewDidLoad()) -> Event next(ab)
2018-02-22 11:47:30.464: ViewController.swift:26 (viewDidLoad()) -> Event next(abc)

如果您遇到问题,请发布您的图书馆版本,以便我提供帮助。