2017-06-25 9 views
0

ich versuche Kettenanfragen mit RxJava + Retrofit + Kotlin zu lernen. Das Tutorial, das ich verfolgte, war RxJava 1.x, also, wenn ich versuche, mit RxJava 2.x zu re-implementieren, kann ich nicht .zip() zu arbeiten.RxJava 1.x .zip() funktioniert nicht auf RxJava 2.0

Es ist eine einfache App mit Star Wars API, die eine Liste von Filmen zurückgibt, undo für jeden Film, holen Sie sich die Charaktere von ihnen.

fun loadMoviesFull(): Observable<Movie> { 
    return service.listMovies() 
      .flatMap { filmResults -> Observable.from(filmResults.results) } 
      .flatMap { film -> 
       Observable.zip(
         Observable.just(Movie(film.title, film.episodeId, ArrayList<Character>())), 
         Observable.from(film.personUrls) 
           .flatMap { personUrl -> 
            service.loadPerson(Uri.parse(personUrl).lastPathSegment) 
           } 
           .map { person -> 
            Character(person!!.name, person.gender) 
           } 
           .toList(), 
         { movie, characters -> 
          movie.characters.addAll(characters) 
          movie 
         }) 
      } 
} 

Wenn Sie die gesamte Umsetzung des Tutorials sehen mögen, dies ist die Verbindung (Die Kommentare sind in portugiesisch) ist: http://www.nglauber.com.br/2017/03/rxjava-kotlin-retrofit-star-wars-api.html

Ich möchte nur die Syntax für ir wissen, denn ich kann nicht implementieren auf 2.x.

Vielen Dank und es tut mir leid für mein schlechtes Englisch.

Antwort

0

Ich weiß nicht, welche Fehler Compiler erzeugt aber sehr wahrscheinlich sollte Ihre Funktion zurückgeben Observable<List<Movie>>, zip ‚s BiFunction erfordert Typen explizit vorbei und sollten einzelne movie nicht am Ende haben. Und natürlich .toList() am Ende.

Voll Code:

fun loadMoviesFull(): Observable<List<Movie>> { 
    return service.listMovies() 
      .flatMap { filmResults -> Observable.from(filmResults.results) } 
      .flatMap { film -> 
       Observable.zip(
         Observable.just(Movie(film.title, film.episodeId, ArrayList<Character>())), 
         Observable.from(film.personUrls) 
           .flatMap { personUrl -> 
            service.loadPerson(Uri.parse(personUrl).lastPathSegment) 
           } 
           .map { person -> 
            Character(person!!.name, person.gender) 
           } 
           .toList(), 
         BiFunction<Movie, Character, Movie>{ movie, characters -> 
          movie.characters.addAll(characters) 
         }) 
      }.toList() 
} 
0

Es lässt mich keinen Kommentar wegen unzureichender Ruf fügen, also als Antwort veröffentlichen. Verwenden Sie rxkotlin? Es gibt eine Reihe von Hilfefunktionen, einschließlich Observable.zip(), die bei der Verwendung von Rx2 bei den SAM-Ambiguitätsproblemen helfen. Ohne zu wissen, was dein Fehler ist, ist das der beste Rat, den ich geben kann.