2016-09-08 3 views
0

Ich möchte eine Cold Observable erstellen, die nur teure Operation starten würde, wenn es ein tatsächliches Abonnement gibt. ReplaySubject würde gut passen, außer für den Teil, der in der Lage sein muss, eine teure Hintergrundoperation zu starten, wenn das eigentliche Abonnement gemacht wird, und nicht auf dem Observablen. Gibt es einen Weg dazu? Eine Art von onSubscribed { ... } Methode.Ist es möglich, `ReplaySubject` zu veranlassen, eine Schließung durchzuführen, wenn man abonniert wird?

+0

Könnten Sie nicht ein "DoOn" auf der Observablen verwenden? http://reactivex.io/documentation/operators/do.html – sbarow

+0

'doOn' werden ausgelöst, wenn das Observable bereits heiß ist, dh die Ereignisse erzeugt. Wenn ich 'doOn' verwenden würde, um Ereignisse zu erzeugen, würde das nie funktionieren. – courteouselk

+0

Ja, aber darum geht es in Ihrer Frage. Führen Sie nur einige Vorgänge beim Abonnement durch. Wenn Ihr kaltes Observable beginnt. Er schlug nicht vor, dass Sie nur 'doOn', sondern' doOn' und dann das 'subscribe' verwenden. – solidcell

Antwort

1

Hier sind ein paar Optionen:

die teure Operation zu einem doOn(onSubscribe:) Hinzufügen, die zwischen dem Observable und das Abonnement in ist:

let observable = Observable.of(1, 2) 
    .doOn(onSubscribe: { _ in 
     expensiveOperation() 
    }) 

observable 
    .subscribeNext { e in 
     print(e) 
    } 

Herstellung des Observable verbindbar und Trennen des doOn(onSubscribe:):

let observable = Observable.of(1, 2) 
    .publish() 

observable 
    .doOn(onSubscribe: { _ in 
     expensiveOperation() 
    }) 
    .subscribe() 

observable 
    .subscribeNext { e in 
     print(e) 
    } 

observable.connect() 
+0

Sorry, aber meine Instanz von RxSwift hat keine 'doOn (onSubscribe:)' Methode. Wenn ich versuche, es zu benutzen, erhalte ich einen Fehler: "irrelevantes Argument Label" onSubscribe: 'in Anruf .doOn (onSubscribe: {_ in ... 'Ich benutze 2.6.0. Welche Version sind Sie? – courteouselk

+0

Dies ist in 3.0 .0.alpha.1, wenn Sie nicht verwenden können, dann verwenden Sie möglicherweise die "connectable" -Methode, außer DoOn nicht verwenden, sondern wickeln Sie einfach den Verbindungsaufruf in einer Methode, wo Sie auch einen Aufruf an Ihre teure Methode – solidcell

+0

Ich zog zu 3.0.0.β.1 (und XCode 8 GM) und es funktioniert jetzt wie erwartet.Thanks für den Vorschlag. – courteouselk

Verwandte Themen