转自航哥的文章 www.hangge.com/blog/cache/…
RxSwift学习成本我感觉挺高,尤其是对于我这种非科班出身的人...但是从开始讨论的swift作为iOS开发语言到底值不值得学,自己迷迷瞪瞪开始了swift旅程,到现在rx值不值得学,其实有什么值不值得,还不是自己想不想再去提升自己一点点吗?学到的就是自己的!
检测当前值与初始值是否相同 (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) }
}
}
2.重复执行某个操作序列 (1)为保证通用性,我们首先对 ObservableConvertibleType 进行扩展,增加一个 repeatWhen 的方法。 (2)该方法还会监视另一个序列,这里我称其为 notifier。当 notifier 发出新事件时,会将原始序列再次发出。从而实现源序列的重复执行。
extension ObservableConvertibleType {
//当被监视的序列(notifier)发出事件时,重新发送源序列
func repeatWhen<O: ObservableType>(_ notifier: O) -> Observable<E> {
return notifier.map { _ in }
.startWith(())
.flatMap { () -> Observable<E> in
self.asObservable()
}
}
}