2016-06-22 2 views
16

Ich bin ein wenig verwirrt über die Reihenfolge, die Sie die und observeOn Methoden auf Observablen aufrufen können. Ich lese ein paar Posts und einer der Jungs sagt, dass es egal ist und verwendet nur etwas in seinem Beispiel und andere Leute sagen, dass es wichtig ist. So, hier ist meine Frage:Stimmt die Reihenfolge von subscribeOn und observeOn?

Zum Beispiel:

self.remoteService.rxGetAllLanguages() 
      .observeOn(MainScheduler.instance) 
      .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background)) 
      .subscribe({ e in 
       switch e { 
       case .Next(let element): 

       case .Error(let e): 
        DDLogError("Error in \(e)") 
       case .Completed: 
        DDLogDebug("Completed") 
       } 
       } 
      ).addDisposableTo(self.disposeBag) 

Ist das das gleiche wie:

self.remoteService.rxGetAllLanguages() 
        .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background)) 
        .observeOn(MainScheduler.instance) 
        .subscribe({ e in 
         switch e { 
         case .Next(let element): 

         case .Error(let e): 
          DDLogError("Error in \(e)") 
         case .Completed: 
          DDLogDebug("Completed") 
         } 
         } 
        ).addDisposableTo(self.disposeBag) 

Wenn ich es richtig, die Mechanismen verstehen, dass sie anders sind. Der erste erledigt die ganze Arbeit am Haupt-Thread und der zweite erledigt die ganze Arbeit an einem anderen Thread und sendet dann zurück zum Haupt-Thread. Aber ich bin mir sicher, kann jemand das bitte für mich klären?

Antwort

31

Wo Sie subscribeOn() in einer Kette anrufen, ist nicht wirklich wichtig. Wo Sie anrufen observeOn() ist wichtig.

subscribeOn() erzählt die gesamte Kette der Thread zu Start Verarbeitung auf. Sie sollten es nur einmal pro Kette aufrufen. Wenn Sie es weiter unten im Stream aufrufen, hat das keine Auswirkung.

observeOn() bewirkt, dass alle darunter liegenden Operationen auf dem angegebenen Scheduler ausgeführt werden. Sie können es mehrmals pro Stream aufrufen, um zwischen verschiedenen Threads zu wechseln.

Nehmen Sie das folgende Beispiel:

doSomethingRx() 
    .subscribeOn(BackgroundScheduler) 
    .doAnotherThing() 
    .observeOn(ComputationScheduler) 
    .doSomethingElse() 
    .observeOn(MainScheduler) 
    .subscribe(//...) 
  • Die subscribeOn Ursachen doSomethingRx auf dem BackgroundScheduler aufgerufen werden.
  • doAnotherThing auf BackgroundScheduler weiterhin
  • dann observeOn schaltet den Strom zum ComputationScheduler
  • doSomethingElse auf dem ComputationScheduler
  • andere observeOn schaltet den Strom zum MainScheduler
  • abonnieren geschieht auf dem MainScheduler passieren wird
+0

Hallo @Jahnold, die RxSwift-Dokumentation sagt - "Wenn Sie Sequenz-Generierung (subscribe-Methode) starten und dispose auf einem bestimmten Scheduler aufrufen möchten, verwenden Sie subscribeOn (Scheduler)." Bedeutet dies, wenn wir subscribeOn (:) angeben, wird es die Kette starten, die für den angegebenen Thread spezifiziert wurde, und auch die Dispose des Disposable wird für denselben spezifizierten Thread aufgerufen? – iamyogish

0

Ja, Sie sind richtig. observeOn empfängt nur die Ereignisse für den von Ihnen angegebenen Thread, während subscribeOn die Arbeit innerhalb des angegebenen Threads tatsächlich ausführt.

0

.subscribeOn() -Operator beeinflussen, auf welcher sheduler Kette erstellt wird (nach links davon) und es funktioniert einmal. .observeOn() Einfluss Operator rechts davon - auf dem Scheduler Daten werden nach dem Betreiber verarbeitet werden.

Verwandte Themen