RxSwift 6.7.1

RxSwift 6.7.1

测试已测试
语言语言 SwiftSwift
许可证 NOASSERTION
发布最后发布2024 年 5 月
SPM支持 SPM

Krunoslav ZaherShai Mishali 维护。



RxSwift 6.7.1

  • 作者:
  • Krunoslav Zaher

RxSwift Logo
Build Status Supported Platforms: iOS, macOS, tvOS, watchOS & Linux

Rx 是通过 Observable 接口表达的计算泛型抽象,允许您从 Observable 流中广播和订阅值和其他事件。

RxSwift 是 Reactive Extensions 标准的 Swift 特定实现。

RxSwift Observable Example of a price constantly changing and updating the app's UI

虽然这个版本旨在忠实于 Rx 的原始精神和命名约定,但该项目还旨在为 Rx API 提供真正的 Swift 首选 API。

跨平台文档可以在 ReactiveX.io 上找到。

类似于其他 Rx 实现,RxSwift 的意图是使异步操作的轻松组合和在 Observable 对象形式的数据流成为可能,并附带一系列转换和组合这些异步工作片段的方法。

KVO 观察、异步操作、UI 事件和其他数据流都统一在 序列抽象 下。这就是为什么 Rx 如此简单、优雅和强大的原因。

我来到这里是因为我想...

...理解
… 安装
  • 将 RxSwift/RxCocoa 集成到我的应用程序中。 安装指南
… 故障排除
… 交互
… 比较
… 理解结构

RxSwift 的可组合性与其所驱动的异步工作一样强。其核心单元是 RxSwift 本身,而其他依赖项可以为 UI 工作、测试等添加。

它由五个相互依赖的独立组件组成,如下所述

┌──────────────┐    ┌──────────────┐
│   RxCocoa    ├────▶   RxRelay    │
└───────┬──────┘    └──────┬───────┘
        │                  │        
┌───────▼──────────────────▼───────┐
│             RxSwift              │
└───────▲──────────────────▲───────┘
        │                  │        
┌───────┴──────┐    ┌──────┴───────┐
│    RxTest    │    │  RxBlocking  │
└──────────────┘    └──────────────┘
  • RxSwift:RxSwift 的核心,提供 Rx 标准作为由 ReactiveX 定义的(主要是)。它没有其他依赖项。
  • RxCocoa:为通用 iOS/macOS/watchOS & tvOS 应用程序开发提供特定于 Cocoa 的功能,例如共享序列、属性等。它依赖于 RxSwiftRxRelay
  • RxRelay: 提供了 PublishRelayBehaviorRelayReplayRelay,这三个是围绕 Subjects 的简单封装。它依赖于 RxSwift
  • RxTestRxBlocking:提供基于 Rx 的系统的测试功能。它依赖于 RxSwift

使用方法

以下是一个示例 动作中
定义搜索 GitHub 仓库...
let searchResults = searchBar.rx.text.orEmpty
    .throttle(.milliseconds(300), scheduler: MainScheduler.instance)
    .distinctUntilChanged()
    .flatMapLatest { query -> Observable<[Repository]> in
        if query.isEmpty {
            return .just([])
        }
        return searchGitHub(query)
            .catchAndReturn([])
    }
    .observe(on: MainScheduler.instance)
……然后绑定结果到你的表格中
searchResults
    .bind(to: tableView.rx.items(cellIdentifier: "Cell")) {
        (index, repository: Repository, cell) in
        cell.textLabel?.text = repository.name
        cell.detailTextLabel?.text = repository.url
    }
    .disposed(by: disposeBag)

需求

  • Xcode 12.x
  • Swift 5.x

对于 Xcode 11 及以下版本,请使用 RxSwift 5.x

安装

RxSwift 不包含任何外部依赖

目前支持以下安装选项

手动

打开 Rx.xcworkspace,选择 RxExample 并运行。此方法将构建一切并运行示例应用程序

CocoaPods

# Podfile
use_frameworks!

target 'YOUR_TARGET_NAME' do
    pod 'RxSwift', '6.5.0'
    pod 'RxCocoa', '6.5.0'
end

# RxTest and RxBlocking make the most sense in the context of unit/integration tests
target 'YOUR_TESTING_TARGET' do
    pod 'RxBlocking', '6.5.0'
    pod 'RxTest', '6.5.0'
end

替换 YOUR_TARGET_NAME,然后在 Podfile 目录中输入

$ pod install

XCFrameworks

从RxSwift 6版本开始,每个版本都包含*.xcframework框架的二进制文件。

只需将所需的框架二进制文件拖到目标General选项卡下的Frameworks, Libraries, and Embedded Content部分。

注意:如果您正在使用RxCocoa,在导入RxCocoa之前,务必也拖拽RxCocoaRuntime.xcframework

XCFrameworks instructions

Carthage

将其添加到Cartfile

github "ReactiveX/RxSwift" "6.5.0"
$ carthage update

将Carthage作为静态库使用

Carthage默认将RxSwift构建为动态库。

如果您想使用Carthage将RxSwift构建为静态库,可以使用以下脚本手动修改框架类型,然后再使用Carthage进行构建

carthage update RxSwift --platform iOS --no-build
sed -i -e 's/MACH_O_TYPE = mh_dylib/MACH_O_TYPE = staticlib/g' Carthage/Checkouts/RxSwift/Rx.xcodeproj/project.pbxproj
carthage build RxSwift --platform iOS

Swift Package Manager

注意:Swift Package Manager中存在一个关键的交叉依赖项错误,影响了包括RxSwift在内的许多项目。我们在2020年初提交了错误(SR-12303),但尚未得到回复。效果可能因项目而异。部分解决方案可以在这里找到。

创建一个Package.swift文件。

// swift-tools-version:5.0

import PackageDescription

let package = Package(
  name: "RxTestProject",
  dependencies: [
    .package(url: "https://github.com/ReactiveX/RxSwift.git", .exact("6.5.0"))
  ],
  targets: [
    .target(name: "RxTestProject", dependencies: ["RxSwift", "RxCocoa"])
  ]
)
$ swift build

要使用RxTest依赖关系构建或测试模块,设置TEST=1

$ TEST=1 swift test

手动使用git子模块

  • 将RxSwift作为子模块添加
$ git submodule add [email protected]:ReactiveX/RxSwift.git
  • Rx.xcodeproj拖拽到项目导航器
  • 转到项目菜单:点击Project > Targets > Build Phases > Link Binary With Libraries,点击+号并选择RxSwiftRxCocoaRxRelay目标

参考文献