iOS RxSwift - 如何“断开”一个 observable?

Posted

技术标签:

【中文标题】iOS RxSwift - 如何“断开”一个 observable?【英文标题】:iOS RxSwift - how to “disconnect” an observable? 【发布时间】:2018-09-16 12:01:13 【问题描述】:

我正在构建一个聚合器类,它连接多个可观察对象并从这些可观察对象发出单个发射序列:

来自源的 5 个输入进入,一个来自ReplaySubject 的输入。

有没有办法在这个聚合器中管理订阅,以允许其中一个来源“断开”而不破坏整个链?

保留[Observable: Subscription] 的字典是否有助于取消特定订阅?

【问题讨论】:

这个问题太模糊了。你能发布一些代码来展示这些订阅是如何组合的吗? 一个主题可以通过手动调用'dispose'来终止。 【参考方案1】:

听起来您可能会从Store object 之类的东西中受益(转载如下。)

您的商店与您的输入源绑定。 (如myInput.bind(to: myStore).disposed(by: bag))并且输出绑定到商店的状态。 (如myStore.state.bind(to: myOutput).disposed(by: bag)

输入可以通过完成断开连接,输出可以通过处理相关的一次性用品断开连接。

reducer 的工作是将输入转换为输出。

//
//  Store.swift
//
//  Created by Daniel Tartaglia on 3/11/17.
//  Copyright © 2017 Haneke Design. MIT License
//
import Foundation
import RxSwift


class Store<State, Action> 

    init(initialState: State, reducer: @escaping (State, Action) -> State) 
        state = actions
            .scan(initialState, accumulator: reducer)
            .startWith(initialState)
            .share(replay: 1)
    

    let state: Observable<State>

    private let actions = PublishSubject<Action>()



extension Store: ObserverType 

    typealias E = Action

    func on(_ event: Event<E>) 
        actions.on(event)
    

【讨论】:

以上是关于iOS RxSwift - 如何“断开”一个 observable?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 RxSwift 用于 Objective-C 和 Swift 项目?

如何将 RxSwift 的 Single 转换为 Observable 并忽略“完成”事件?

如何正确地将 3rd 方库委托转换为 RxSwift Observable

iOS RxSwift - 如何使用 Amb 运算符?

RxSwift throttle() 获取第一个元素

RxSwift:仅在满足要求时才压缩 Observables