2016-05-06 9 views
1

Ich habe auf der Suche Controller arbeiten, die RxSwift verwendet Datasource zu aktualisieren, wenn Benutzer in Suchfeld, wie es hier beschrieben ist: http://www.thedroidsonroids.com/blog/ios/rxswift-examples-3-networking/RxSwift: Beobachten rx_text & rx_offset gleichzeitig

Das ist mein Viewmodel ist:

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) 
    } 
} 

Jetzt möchte ich, dass neue Daten nicht nur geladen werden, wenn der Benutzer tippt, sondern auch, wenn sh scrollt. Ich dachte, combineLatest zu verwenden, um sowohl rx_text als auch rx_offset zu beobachten, aber ich kann Observable nicht an compileLatest wegen Kompilierungsfehler übergeben.

+0

Was ist der Kompilierungsfehler? combineLatest benötigt mehrere Observables, das ist also merkwürdig. – solidcell

+0

@solidcell Kann 'CombineLatest' nicht mit einer Argumentliste des Typs (Observable , Observable ) – alexxjk

+0

aufrufen Ich habe unten beantwortet. Wenn Sie Ihre Swift-Fragen mit einem 'swift'-Tag markieren, erhalten Ihre Fragen (und die Antworten) Syntax-Highlighting. – solidcell

Antwort

2

Der Kompilierungsfehler, den Sie sehen, liegt daran, dass Sie keine tatsächliche Methode verwenden. Die Signatur der Methode sind die beabsichtigen, den Sie zu verwenden ist:

public class func combineLatest<O1 : ObservableType, O2 : ObservableType>(source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> Element) -> RxSwift.Observable<Element> 

Beachten Sie, dass es ein drittes Argument ist, dass Sie vergessen: resultSelector. Das soll ein Block sein, der beschreibt, wie Sie die neuesten Elemente zu einem neuen Element kombinieren wollen.

Basierend auf Ihrer Fehlermeldung, ich denke Sie es wie folgt aus:

let combined = Observable.combineLatest(stringObservable, pointObservable) 

Während, sollten Sie es wie folgt verwenden:

let combined = Observable.combineLatest(stringObservable, pointObservable) { (s, p) in 
    return "\(s), \(p)" // or construct your new element however you'd like 
} 

Ohne den Block, RxSwift weiß nicht, wie Sie diese kombinieren möchten. Sie haben vielleicht gedacht, dass es nur ein neues Tupel von (String, CGPoint) als das Element machen würde, aber es macht keine solchen Annahmen und erfordert, dass Sie es sagen.