2016-09-12 4 views
4

나는이처럼 보이는 무언가가있는 경우 : 나는 그렇게 얼마나관측 대상에서 어떻게 탈퇴합니까?

내가 나중에 bar의 관찰에서 unsubscribe하려면
func foo() -> Observable<Foo> { 
    return Observable.create { observer in 
     // ... 
    } 
    } 

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

?

업데이트

내가 dispose를 호출 할 수 있습니다 알고 있어요,하지만 RxSwift docs에 따라 : 당신은 일반적으로 수동으로 처리를 호출하지 않으

참고; 이것은 단지 교육적인 예일뿐입니다. 수동으로 처리하는 것은 대개 잘못된 코드 냄새입니다.

그럼 unsubscribe은 구현되지 않았습니까? 나는 RxSwift 코드를 통해 spelunking을했는데, 무슨 일이 벌어지는 지 이해할 수있을 정도로 subscribe 메소드에서 반환되는 Disposable이 유용한 기능 (처분 제외)이 아닌 것으로 보입니다.

답변

3

foo에서 disposeBag으로 반환되는 Observable을 추가합니다. 할당이 해제되면 구독을 삭제합니다. 당신은 "수동으로"클래스의 어딘가에

disposeBag = nil

를 호출하여 disposeBag을 해제 할 수 있습니다.

질문 편집 후 : 일부 조건이 충족 될 때 일부 Observables에서 선택적으로 수신 거부를 원할 수 있습니다. 이러한 조건을 나타내는 또 다른 Observable을 사용하고 takeUntil 연산자를 사용하여 필요에 따라 구독을 취소 할 수 있습니다. 당신이 처분 할 때 해제 할 때 다른 DisposeBag

var tempBag = DisposeBag() 

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

를 작성했다 않았다 무엇

//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

죄송합니다, 나의 단순화 된 예제는 하나만 관찰 할 수 있습니다. 실제로 나는 내가 관찰하고있는 비행 중에 여러 가지 작업을 할 것이고, 나는 일부로부터 선택적으로 탈퇴하고 싶을 것이다. 처분 가방을 풀면 모두 구독 취소됩니다. 나중에 나중에 처분 ​​가방을 필요로 할 것입니다. 또한, 나는'dispose'를 호출 할 수 있지만 docs에 따르면 이것은 나쁜 코드 냄새라는 것을 알고 있습니다. 내 질문에 업데이트 된 텍스트를 참조하십시오. 감사. –

+0

유스 케이스에 따라'takeUntil'은'unsubscribe'와 동일 할 수도 있습니다. 내 업데이트 답변을 참조하십시오. –

-1

그래서 당신은 tempBag = nil 할 수 있습니다. 다른 일회용품을 계속 보관하는 또 다른 DisposeBag이 있습니다.

+0

첫 번째 '일회용'을 처리하지 않을 것입니다. 당신은 단지 또 다른 완전히 새로운 '일회용'을 만들고 있습니다. – solidcell

+0

@solidcell 필자가 원한다면 언제든지 'tempBag = nil'으로 해제 할 수있는 또 다른'DisposeBag'를 만들 수 있습니다. 반면에 다른 Disposable을 보관하는 또 다른 DisposeBag가 있습니다. – wint

+0

무슨 뜻인지 알 겠어. 그러나 당신의 대답은 여전히 ​​당신이 구독을 취소하는 방법을 보여주지 못하며 또 다른'DisposeBag'에'tempBag' *를 사용하는 것을 보여주지 못합니다. – solidcell