首先有几个问题记录下:
问题1:为什么点击输入框的时候输出打印了两次
_ = textFiled.rx.text.subscribe(onNext : { (text) in
print("输入%@",text ?? "")
})
输出结果如下:

不细心根本没发现哈哈,大牛讲的在这总结一下。
原因:第一次是初始化。不用点击就会打印。
command单击显示text进入text的getter方法。

setter: { textField, value in
// This check is important because setting text value always clears control state
// including marked text selection which is imporant for proper input
// when IME input method is used.
if textField.text != value {
c.text = value
}
}
调用text就给textField赋值value。

序列(Observable)的创建闭包creat,绑定关系。observer.on发送信号到subscribe。
系统给内部的UI响应addTarget。
第二次是点击事件响应。
通过* return base.rx.controlPropertyWithDefaultEvents来自于allEditingEvents观察valueChanged*事件。

可以通过skip(1)防止打印初始化那一次。
_ = textFiled.rx.text.skip(1).subscribe(onNext : { (text) in
print("输入%@",text ?? "")
})
问题2:
// 2:问题2
_ = Observable<String>.create{ (obserber) ->Disposable in
obserber.onNext("你好")
obserber.onCompleted()
return Disposables.create()
}.subscribe{
print("订阅到:\($0)")
}
输出结果
订阅到:next(你好)
订阅到:completed
因为$0是输出的事件方法名。
原因是subscribe直接on返回事件。可以利用枚举值拿到事件名。
public func subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)
-> Disposable {
······
switch event {
case .next(let value):
onNext?(value)
case .error(let error):
if let onError = onError {
onError(error)
}
else {
Hooks.defaultErrorHandler(callStack, error)
}
disposable.dispose()
case .completed:
onCompleted?()
disposable.dispose()
}
}
return Disposables.create(
self.asObservable().subscribe(observer),
disposable
)
}
}
switch $0 {
case .next(let value):
print("next == (value)")
case .error(let error):
print("error == (error)")
case .completed:
print("completed ")
}
网友评论