Entwine

CI @tcldr1

Apple 的 Combine 框架 提供的配件。


关于

Entwine 包含三个库(位于两个仓库中),旨在与 Apple 的 Combine 框架结合使用。

注意:EntwineRx 作为单独的 Swift 包进行维护,以最大限度地减少 SPM 依赖关系图.


快速入门指南

从任何来源创建 Combine Publisher

使用来自 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 {}
}

单元测试 Combine Publisher 序列

使用 TestSchedulerTestablePublisherTestableSubscriber 来模拟 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
    ])
}

将您的 RxSwift 视图模型桥接到 Combine 并与 SwiftUI 一起使用

首先,请确保将 EntwineRx Swift Package(位于外部 repo 中)作为依赖项添加到您的项目中。

示例即将推出


要求

Entwine 位于 Apple 的 Combine 框架之上,因此需要 Xcode 11 并且最低部署目标为 macOS 10.15iOS 13tvOS 13watchOS 6


安装

Entwine 通过 Swift Package 交付,可以通过将其添加到 Package.swift 文件的依赖项部分,或通过 Xcode 11 中的 File -> Swift Packages -> Add package dependency... 菜单,将其作为依赖项安装到另一个 Swift Package 或 Xcode 11 项目中。


文档

每个软件包的文档可在以下位置找到


版权和许可

本项目已根据 MIT 许可证 发布