ReactiveX / RxSwift
- понедельник, 30 сентября 2019 г. в 00:21:33
Swift
Reactive Programming in Swift
Rx is a generic abstraction of computation expressed through Observable<Element> interface.
This is a Swift version of Rx.
It tries to port as many concepts from the original version as possible, but some concepts were adapted for more pleasant and performant integration with iOS/macOS environment.
Cross platform documentation can be found on ReactiveX.io.
Like the original Rx, its intention is to enable easy composition of asynchronous operations and event/data streams.
KVO observing, async operations and streams are all unified under abstraction of sequence. This is the reason why Rx is so simple, elegant and powerful.
Single, Completable, Maybe, Driver, and ControlProperty ... and why do they exist?RxSwift comprises five separate components depending on eachother in the following way:
┌──────────────┐ ┌──────────────┐
│ RxCocoa ├────▶ RxRelay │
└───────┬──────┘ └──────┬───────┘
│ │
┌───────▼──────────────────▼───────┐
│ RxSwift │
└───────▲──────────────────▲───────┘
│ │
┌───────┴──────┐ ┌──────┴───────┐
│ RxTest │ │ RxBlocking │
└──────────────┘ └──────────────┘
RxSwift and RxRelay.PublishRelay and BehaviorRelay, two simple wrappers around Subjects. It depends on RxSwift.RxSwift.For Xcode 10.1 and below, use RxSwift 4.5.
Rx doesn't contain any external dependencies.
These are currently the supported options:
Open Rx.xcworkspace, choose RxExample and hit run. This method will build everything and run the sample app
# 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'
endReplace YOUR_TARGET_NAME and then, in the Podfile directory, type:
$ pod installOfficially supported: Carthage 0.33 and up.
Add this to Cartfile
github "ReactiveX/RxSwift" ~> 5.0
$ carthage updateCarthage defaults to building RxSwift as a Dynamic Library.
If you wish to build RxSwift as a Static Library using Carthage you may use the script below to manually modify the framework type before building with 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 iOSCreate a Package.swift file.
// 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 buildTo build or test a module with RxTest dependency, set TEST=1.
$ TEST=1 swift test$ git submodule add git@github.com:ReactiveX/RxSwift.gitRx.xcodeproj into Project NavigatorProject > Targets > Build Phases > Link Binary With Libraries, click + and select RxSwift-[Platform] and RxCocoa-[Platform] targets