2016-09-12 5 views
4

Wenn ich etwas, das wie folgt aussieht:Wie kann ich eine Observable abbestellen?

func foo() -> Observable<Foo> { 
    return Observable.create { observer in 
     // ... 
    } 
    } 

    func bar() { 
    foo().observeOn(MainScheduler.instance) 
     .subscribeNext { 
     // ... 
     } 
     .addDisposableTo(disposeBag) 
    } 

Wenn ich in bar später zu unsubscribe aus dem beobachtbaren will, wie würde ich das tun?

aktualisieren

Ich bin mir bewusst, ich dispose nennen kann, sondern nach dem RxSwift docs:

Beachten Sie, dass Sie in der Regel nicht wollen, manuell entsorgen nennen; Dies ist nur ein Bildungsbeispiel. Der manuelle Aufruf von dispose ist normalerweise ein schlechter Code-Geruch.

So ist unsubscribe gerade nicht implementiert? Ich bin durch den RxSwift-Code spelunking gegangen, und in dem Ausmaß, dass ich verstehen kann, was los ist, sieht es nicht aus wie die , die von den Subscribe-Methoden zurückgegeben wird, ist alles mit nützlichen Funktionen (außer Entsorgung).

Antwort

3

Sie fügen die Observable, die von foo zurückgegeben wird, zu disposeBag hinzu. Es entsorgt das Abonnement, wenn es freigegeben wird. Sie können "manuell" die disposeBag Freigabe durch

disposeBag = nil

irgendwo in der Klasse aufrufen.

Nach dem Bearbeiten der Frage: Sie möchten einige Observables selektiv abbestellen, wahrscheinlich wenn einige Bedingungen erfüllt sind. Sie können einen anderen Observable verwenden, der diese Bedingungen darstellt, und den Operator takeUntil verwenden, um das Abonnement nach Bedarf abzubrechen.

//given that cancellingObservable sends `next` value when the subscription to `foo` is no longer needed 

foo().observeOn(MainScheduler.instance) 
    .takeUntil(cancellingObservable) 
    .subscribeNext { 
    // ... 
    } 
    .addDisposableTo(disposeBag) 
+0

Entschuldigung, mein vereinfachtes Beispiel hat nur eine Observable. In Wirklichkeit werde ich mehrere Aufgaben im Flug haben, die ich beobachte, und ich werde mich selektiv von einigen abmelden wollen. Wenn ich den Entsorgungssack entsorge, werden alle abgemeldet. Und ich werde die Entsorgungsbeutel später auch für den vorgesehenen Gebrauch brauchen. Außerdem bin ich mir bewusst, dass ich 'dispose' nennen kann, aber laut den Dokumenten ist das ein schlechter Code-Geruch. Siehe aktualisierten Text in meinen Fragen. Vielen Dank. –

+0

Je nach Anwendungsfall kann 'takeUntil' ein Äquivalent zu' unsubscribe' sein. Siehe meine aktualisierte Antwort. –

-1

Was ich tat, war die Schaffung einer anderen DisposeBag

var tempBag = DisposeBag() 

fun bar() { 
    foo().subscribe().addDisposable(tempBag) 
} 

so, wenn Sie entsorgen möchten, können Sie einfach tun tempBag = nil wenn Sie freigeben möchten. während Sie noch ein anderes DisposeBag haben, das andere Wegwerfartikel am Leben erhält.

+0

Das wird nicht das erste 'Disposable' entsorgen. Sie erstellen nur ein völlig neues "Disposable". – solidcell

+0

@solidcell mein Punkt ist, Sie können einen anderen 'DisposeBag' erstellen, wo Sie es jederzeit mit' tempBag = nil' freigeben können. Während Sie noch einen 'DisposeBag' haben, der andere Einwegartikel enthält. – wint

+0

Ich sehe was du meinst. Ihre Antwort zeigt jedoch immer noch nicht, wie Sie sie zum Abbestellen verwenden würden, noch zeigt sie, dass Sie "tempBag" zusätzlich zu einem anderen "DisposeBag" verwenden würden. – solidcell

Verwandte Themen