简介
Rx是通过接口(Observable<Element>)表示的通用抽象的计算。
RxSwift是Rx的Swift版本。
它试图尽可能多地从原始版本移植概念,但是为了更好地与iOS/macOS环境集成,对一些概念进行了调整。
可以在ReactiveX.io上找到跨平台的文档。
与原始Rx一样,它的目的是使异步操作、事件和数据流易于组合。
KVO观察、异步操作和流都在序列(sequence)的抽象下统一。这就是Rx如此简单、优雅和强大的原因。
结构
RxSwift包含五个独立的组件,具体如下:
┌──────────────┐ ┌──────────────┐
│ RxCocoa ├────▶ RxRelay │
└───────┬──────┘ └──────┬───────┘
│ │
┌───────▼──────────────────▼───────┐
│ RxSwift │
└───────▲──────────────────▲───────┘
│ │
┌───────┴──────┐ ┌──────┴───────┐
│ RxTest │ │ RxBlocking │
└──────────────┘ └──────────────┘
- RxSwift:RxSwift的核心,提供Rx标准(主要)由ReactiveX定义。它没有其他依赖项。
- RxCocoa:为iOS/macOS/watchOS和tvOS应用程序开发提供特定Cocoa功能,例如Binders,Traits 等等。它依赖于RxSwift和RxRelay。
- RxRelay:提供PublishRelay和BehaviorRelay这两个围绕Subjects的简单包装器。它依赖于RxSwift。
- RxTest和RxBlocking:为基于Rx的系统提供测试功能。它依赖于RxSwift。
用法
<table>
<tr>
<th width="30%">这是一个例子</th>
<th width="30%">效果</th>
</tr>
<tr>
<td>定义从GitHub仓库的搜索……</td>
<th rowspan="9"><img src="https://raw.githubusercontent.com/kzaher/rxswiftcontent/master/GithubSearch.gif"></th>
</tr>
<tr>
<td><div class="highlight highlight-source-swift"><pre>
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)
.catchErrorJustReturn([])
}
.observeOn(MainScheduler.instance)</pre></div></td>
</tr>
<tr>
<td>……然后绑定结果到tableview</td>
</tr>
<tr>
<td width="30%"><div class="highlight highlight-source-swift"><pre>
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)</pre></div></td>
</tr>
</table>
安装
RxSwift不包含任何外部依赖项。
这些是目前支持的安装方式:
手动安装
打开 Rx.xcworkspace, 选中 RxExample 并且点击运行。 此方法将构建所有内容并运行示例应用程序。
CocoaPods
# Podfile
use_frameworks!
target 'YOUR_TARGET_NAME' do
pod 'RxSwift', '~> 5'
pod 'RxCocoa', '~> 5'
end
# RxTest and RxBlocking make the most sense in the context of unit/integration tests
target 'YOUR_TESTING_TARGET' do
pod 'RxBlocking', '~> 5'
pod 'RxTest', '~> 5'
end
替换YOUR_TARGET_NAME然后在Podfile目录中键入:
$ pod install
Carthage
官方支持Carthage 0.33及以上版本。
添加到 Cartfile
github "ReactiveX/RxSwift" ~> 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 RxAlamofire --platform iOS
Swift Package Manager
创建Package.swift 文件。
// swift-tools-version:5.0
import PackageDescription
let package = Package(
name: "RxTestProject",
dependencies: [
.package(url: "https://github.com/ReactiveX/RxSwift.git", from: "5.0.0")
],
targets: [
.target(name: "RxTestProject", dependencies: ["RxSwift", "RxCocoa"])
]
)
$ swift build
要构建或测试的一个模块对RxTest存在依赖,设置 TEST=1.
$ TEST=1 swift test
使用git submodules手工集成
- 将RxSwift作为子模块添加
$ git submodule add git@github.com:ReactiveX/RxSwift.git
- 拖拽Rx.xcodeproj到项目中
- 前往 Project > Targets > Build Phases > Link Binary With Libraries, 点击 + 并且选中 RxSwift-[Platform] 和 RxCocoa-[Platform]
网友评论