STDevRxExt 1.1.0

STDevRxExt 1.1.0

STDev Team 维护。



 
依赖关系
RxSwift~> 6
RxCocoa~> 6
 

  • Tigran Hambardzumyan

STDevRxExt

CI Status Version License Platform

示例

要运行 Example.playground,首先克隆仓库,然后在 Example 目录中运行 pod install

需求

  • iOS 8.0+
  • tvOS 9.0+
  • macOS 10.10+
  • watchOS 3.0+
  • Swift 5.0+
  • Xcode 11+

安装

CocoaPods

STDevRxExt 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile

pod 'STDevRxExt'
Swift 包管理器

您可以使用 Swift 包管理器 通过向您的 Package.swift 文件添加适当的描述来安装 STDevRxExt

import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    targets: [],
    dependencies: [
        .package(url: "https://github.com/STDevTM/STDevRxExt.git", from: "1.0.0")
    ]
)

接下来,按照如下方式将 STDevRxExt 添加到目标的依赖关系中

.target(
    name: "YOUR_TARGET_NAME",
    dependencies: [
        "STDevRxExt",
    ]
),

然后运行 swift package update

所有扩展列表

过滤扩展

仅允许从 Observable<Bool> 中来的 true 元素

let disposeBag = DisposeBag()

Observable.of(true, false, false, true, true)
    .allowTrue()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出将会是

true
true
true

你还可以在 Bool? 上使用 allowTrue。在这种情况下,nil 元素将被忽略

let disposeBag = DisposeBag()

Observable.of(true, false, nil, true, nil, true)
    .allowTrue()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出将会是

true
true
true

如果你希望也允许 nil 元素,则可以像这样使用 allowTrueOrNil

let disposeBag = DisposeBag()

Observable.of(true, false, nil, true, nil, true, false)
    .allowTrueOrNil()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出将会是

true
true
true
true
true

映射扩展

你可以使用提供的值映射序列中的每个元素。

let disposeBag = DisposeBag()

Observable.of(1, 5, 7, 8)
    .map(to: "ping")
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出将会是

ping
ping
ping
ping

你可以通过提供的关键路径映射序列中的每个元素。

let disposeBag = DisposeBag()

   let observable = Observable.of(
            Book(title: "Twenty Thousand Leagues Under the Sea", author: Author("Jules", "Verne")),
            Book(title: "Hamlet", author: Author("William", "Shakespeare")),
            Book(title: "Hearts of Three", author: Author("Jack", "London"))
        )

    observable
        .map(at: \.title)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

    observable
        .map(at: \.author.firstName)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

输出将会是

Twenty Thousand Leagues Under the Sea
Hamlet
Hearts of Three

Jules
William
Jack

转换扩展

你可以使用 cast(to:) 方法按顺序进行向下转换。

let disposeBag = DisposeBag()

Observable<CustomStringConvertible>.of("1", "5", "7", "8")
    .cast(to: String.self)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出将会是

Optional("1")
Optional("5")
Optional("7")
Optional("8")

为了强制转换,请使用 forceCast(to:),如下所示

let disposeBag = DisposeBag()

Observable<CustomStringConvertible>.of("1", "5", "7", "8")
    .forceCast(to: String.self)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出将会是

1
5
7
8

在向下转换异常的情况下,它将返回 Observable.error(RxCastError.castFailed)

除了 forceCast(to:) 之外,允许扩展函数也可以用于 Driver

其他扩展

有时我们需要在每个 ObservableDrivernext 事件上更新一些主题或观察者。例如

request
    .do(onNext: { [weak self] _ in
        self?.inProgress.onNext(true)
    })
    .flatMap {
        service.doRequest($0)
    }
    .do(onNext: { [weak self] _ in
        self?.inProgress.onNext(false)
    })
    .subscribe(onNext: { response in
        dump(response)
    })
    .disposed(by: disposeBag)

你可以使用 update(_:with:) 方法来缩短代码,如下所示

request
    .update(inProgress, with: true)
    .flatMap {
        service.doRequest($0)
    }
    .update(inProgress, with: false)
    .subscribe(onNext: { response in
        dump(response)
    })
    .disposed(by: disposeBag)

作者

哈巴祖扬·提格兰,[email protected]

支持

请随时提交问题,包括建议、错误报告、功能请求、疑问。

告诉我们!

如果您在有使用我们组成部分的项目中发送链接,我们将非常高兴。只需发送电子邮件到[email protected]。如果您有任何问题或建议,也请告知我们。

许可

STDevRxExt遵循MIT许可证。更多信息请参阅LICENSE文件。