2017-05-10 7 views
0

rxSwift를 사용하고 있으며, 구독 할 수있는 관찰 가능 사전이 있습니다.관찰 가능 항목 정리하기

var observables: [String: Observable<Bool>] = [:] 

어느 시점에서 나는 이러한 관찰 성의 일부를 정리해야합니다.

observables.removeValue(forKey: someKey) 

충분히 위의 줄을 사용하여 관찰 가능한을 정리하는 데가 다음과 같이 나는 그것을합니까? 관측 가능 대상도 살해 당했습니까 (아니면 내가 어떻게 "죽일 수 있습니까?")? 이미 관찰 대상에 가입 한 사람이있을 수 있으며 사전에서 제거한 후에도 여전히 살아 있고 화재를 일으킬 수 있습니다. 아무도 강력한 참조를 가지고 있지 않기 때문에 내가 그것을 제거하는 순간 관찰 가능합니까? 관측 대상이 잠재 구독자에게 제거되는 순간에는 어떤 일이 발생합니까?

관찰 가능 항목이있는 사전이있는 클래스의 가입자에게 액세스 할 수 없습니다.

+1

당신은 몇 가지 관찰 가능한을 완료하기 위해'takeUntil' 연산자를 사용하거나 가입자 – redent84

+0

대신 클래스에서 관찰의 라이프 사이클을 제어하는'ConnectableObservable'를 사용할 수있는'takeUntil'는 좋은 소리 – KaraBenNemsi

답변

1

takeUntil 연산자를 사용할 수 있습니다. 관찰자에게 완료 신호를 보내 가입자가 보존 된 자원을 방출합니다.

예를 들어 PublishSubject을 설정하여 관찰 가능 식별자를 전송하여 관찰 가능 항목을 완료 할 수 있습니다.

var observables: [String: Observable<Bool>] = [:] 
let finishObservable = PublishSubject<String>() 
func addObservable(observable: Observable<Bool>, withId identifier: String) -> Observable<Bool> { 
    let condition = finishObservable.filter { $0 == identifier } 
    let newObservable = observable.takeUntil(condition) 
    observables[identifier] = newObservable 
    return newObservable 
} 

이 방법, 관측 깨끗한 에, 당신은 관찰 식별자를 보내고 당신은 사전에서 완성 된 시퀀스를 제거 할 수 있습니다.


func removeObservable(identifier: String) { 
    // Complete the observable so it stops sending events and subscriber releases resources 
    finishObservable.onNext(identifier) 
    observables.removeValue(forKey: identifier) 
} 

당신이 관찰자 사이에 가입을 공유 할 계획이라면, 당신은 또한 ConnectableObservable을 사용할 수 있습니다. 구독자가오고 갈 때 같은 관찰 기록을 사용했지만 동일한 구독을 공유하려고합니다. 관측 대상이 네트워크 리소스를 가져 오는 경우 유용합니다.

var disposables: [String: Disposable] = [:] 
func addObservable(observable: Observable<Bool>, withId identifier: String) -> Observable<Bool> { 
    let newObservable: ConnectableObservable = observable.replay(1) 
    disposables[identifier] = newObservable.connect() // This call triggers the subscription, so you can call it later 
    return newObservable 
} 

func removeObservable(identifier: String) { 
    if let disposable = disposables.removeValue(forKey: identifier) { 
     disposable.dispose() 
    } 
} 
관련 문제