为 Apple 的 Combine 框架 提供的配件。
Entwine 包含三个库(位于两个仓库中),旨在与 Apple 的 Combine 框架结合使用。
Entwine Utilities 库 包含额外的运算符、Subject 和实用工具,用于处理 Combine 序列。该软件包目前包含一个 ReplaySubject
,一个 withLatest(from:)
运算符和一个 Publishers.Factory
,用于从任何来源快速定义内联的 Publisher。
EntwineTest 库 包含用于验证 Combine 序列预期行为的工具。它包含一个使用虚拟时间的 TestScheduler
,一个按绝对或相对时间安排用户定义元素序列的 TestablePublisher
,以及一个记录带时间戳的事件列表的 TestableSubscriber
,该列表可以与预期行为进行比较。
EntwineRx 库 是一个维护在 单独仓库 下的小型库,其中包含从 RxSwift 到 Combine 以及从 Combine 到 RxSwift 的桥接运算符,使 RxSwift 和 Combine 能够无缝协作。
注意:EntwineRx 作为单独的 Swift 包进行维护,以最大限度地减少 SPM 依赖关系图.
使用来自 Entwine 包的 Publishers.Factory
Publisher,轻松创建一个 Publisher,该 Publisher 满足来自任何来源的 Combine 背压要求。了解更多关于 Entwine Utilities 库的信息。
用于 PhotoKit 授权状态的内联 Publisher 创建
import Entwine
let photoKitAuthorizationStatus = Publishers.Factory<PHAuthorizationStatus, Never> { dispatcher in
let status = PHPhotoLibrary.authorizationStatus()
dispatcher.forward(status)
switch status {
case .notDetermined:
PHPhotoLibrary.requestAuthorization { newStatus in
dispatcher.forward(newStatus)
dispatcher.forward(completion: .finished)
}
default:
dispatcher.forward(completion: .finished)
}
return AnyCancellable {}
}
使用 TestScheduler
、TestablePublisher
和 TestableSubscriber
来模拟 Combine 序列,并针对预期输出进行测试。了解更多关于 EntwineTest 库的信息
测试 Combine 的 map(_:)
运算符
import XCTest
import EntwineTest
func testMap() {
let testScheduler = TestScheduler(initialClock: 0)
// creates a publisher that will schedule it's elements relatively, at the point of subscription
let testablePublisher: TestablePublisher<String, Never> = testScheduler.createRelativeTestablePublisher([
(100, .input("a")),
(200, .input("b")),
(300, .input("c")),
])
let subjectUnderTest = testablePublisher.map { $0.uppercased() }
// schedules a subscription at 200, to be cancelled at 900
let results = testScheduler.start { subjectUnderTest }
XCTAssertEqual(results.recordedOutput, [
(200, .subscription), // subscribed at 200
(300, .input("A")), // received uppercased input @ 100 + subscription time
(400, .input("B")), // received uppercased input @ 200 + subscription time
(500, .input("C")), // received uppercased input @ 300 + subscription time
])
}
首先,请确保将 EntwineRx Swift Package(位于外部 repo 中)作为依赖项添加到您的项目中。
示例即将推出
Entwine 位于 Apple 的 Combine 框架之上,因此需要 Xcode 11 并且最低部署目标为 macOS 10.15、iOS 13、tvOS 13 或 watchOS 6。
Entwine 通过 Swift Package 交付,可以通过将其添加到 Package.swift
文件的依赖项部分,或通过 Xcode 11 中的 File -> Swift Packages -> Add package dependency...
菜单,将其作为依赖项安装到另一个 Swift Package 或 Xcode 11 项目中。
每个软件包的文档可在以下位置找到
本项目已根据 MIT 许可证 发布