RxSwift:同时观察 rx_text & rx_offset
RxSwift: Observe rx_text & rx_offset simultaneously
我一直在研究一个搜索控制器,当用户在搜索字段中输入时,它使用 RxSwift 更新数据源,就像这里描述的那样:http://www.thedroidsonroids.com/blog/ios/rxswift-examples-3-networking/
那是我的视图模型:
struct SearchControllerViewModel {
let provider: RxMoyaProvider<ThreadifyEndpoint>
let startsWith: Observable<String>
func startSearching() -> Observable<[SearchedNodeViewModel]> {
return startsWith
.observeOn(MainScheduler.instance)
.flatMapLatest { query -> Observable<[SearchedNodeViewModel]?> in
return self.findNodes(query)
}.replaceNilWith([])
}
internal func findNodes(startsWith: String) -> Observable<[SearchedNodeViewModel]?> {
return self.provider
.request(ThreadifyEndpoint.SearchForNodes(startsWith: startsWith))
.mapArrayOptional(SearchedNodeViewModel.self)
}
}
现在我希望不仅在用户键入时而且在 sh 向下滚动时加载新数据。
我正在考虑使用 combineLatest 来观察 rx_text 和 rx_offset 但由于编译错误我无法将 Observable 传递给 combineLatest。
您看到的编译错误是由于您没有使用实际方法造成的。您打算使用的方法签名是:
public class func combineLatest<O1 : ObservableType, O2 : ObservableType>(source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> Element) -> RxSwift.Observable<Element>
请注意,您忘记了第三个参数:resultSelector
。那应该是一个描述你想如何将最新元素组合成一个新元素的块。
根据您的错误消息,我认为您是这样使用它的:
let combined = Observable.combineLatest(stringObservable, pointObservable)
然而,您应该这样使用它:
let combined = Observable.combineLatest(stringObservable, pointObservable) { (s, p) in
return "\(s), \(p)" // or construct your new element however you'd like
}
没有块,RxSwift 不知道你想如何组合它们。您可能一直认为它只是默认创建一个 (String, CGPoint)
的新元组作为元素,但它没有做出这样的假设并且需要您告诉它。
我一直在研究一个搜索控制器,当用户在搜索字段中输入时,它使用 RxSwift 更新数据源,就像这里描述的那样:http://www.thedroidsonroids.com/blog/ios/rxswift-examples-3-networking/
那是我的视图模型:
struct SearchControllerViewModel {
let provider: RxMoyaProvider<ThreadifyEndpoint>
let startsWith: Observable<String>
func startSearching() -> Observable<[SearchedNodeViewModel]> {
return startsWith
.observeOn(MainScheduler.instance)
.flatMapLatest { query -> Observable<[SearchedNodeViewModel]?> in
return self.findNodes(query)
}.replaceNilWith([])
}
internal func findNodes(startsWith: String) -> Observable<[SearchedNodeViewModel]?> {
return self.provider
.request(ThreadifyEndpoint.SearchForNodes(startsWith: startsWith))
.mapArrayOptional(SearchedNodeViewModel.self)
}
}
现在我希望不仅在用户键入时而且在 sh 向下滚动时加载新数据。 我正在考虑使用 combineLatest 来观察 rx_text 和 rx_offset 但由于编译错误我无法将 Observable 传递给 combineLatest。
您看到的编译错误是由于您没有使用实际方法造成的。您打算使用的方法签名是:
public class func combineLatest<O1 : ObservableType, O2 : ObservableType>(source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> Element) -> RxSwift.Observable<Element>
请注意,您忘记了第三个参数:resultSelector
。那应该是一个描述你想如何将最新元素组合成一个新元素的块。
根据您的错误消息,我认为您是这样使用它的:
let combined = Observable.combineLatest(stringObservable, pointObservable)
然而,您应该这样使用它:
let combined = Observable.combineLatest(stringObservable, pointObservable) { (s, p) in
return "\(s), \(p)" // or construct your new element however you'd like
}
没有块,RxSwift 不知道你想如何组合它们。您可能一直认为它只是默认创建一个 (String, CGPoint)
的新元组作为元素,但它没有做出这样的假设并且需要您告诉它。