美文网首页
Combine -- Subject

Combine -- Subject

作者: jancywen | 来源:发表于2021-02-22 11:26 被阅读0次

Subject 也是 Combine 框架中的一个协议,它为我们提供了从外界发送数据的方式

public protocol Subject : AnyObject, Publisher {
    func send(_ value: Self.Output)
    func send(completion: Subscribers.Completion<Self.Failure>) 
    func send(subscription: Subscription) 
}

外界每次调用 send(_:) 或者 send(completion:),对应的 Subject 就会向外发布一个事件

框架里也预先定义了两种最常用的 Subject,它们分别是 PassthroughSubjectCurrentValueSubject

PassthroughSubject 简单地将 send 输入的内容如实反馈,
CurrentValueSubject 则保留一个最后的值,并在被订阅时将这个值作为事件发送。

时序

Subject 严格遵守时序的特性,让我们有机会同时验证那些对时序敏感的多个 Publisher 的组合。

merge

按照时序合并两个或多个publisher

let subject_example1 = PassthroughSubject<Int, Never>()
let subject_example2 = PassthroughSubject<Int, Never>()

check("Subject Order") {
    subject_example1.merge(with: subject_example2)
}

subject_example1.send(10)
subject_example2.send(20)
subject_example2.send(21)
subject_example1.send(14)
subject_example1.send(16)
subject_example2.send(25)

// ----- Subject Order -----
// receive subscription: (Merge)
// request unlimited

// receive value: (10)
// receive value: (20)
// receive value: (21)
// receive value: (14)
// receive value: (16)
// receive value: (25)
// receive cancel

zip (当...且...)

把两个 (或多个) Publisher 事件序列中在同一 index 位置上的值进行合并。
Publisher1 发布值, Publisher2 发布值时,将两个值合并,作为新的事件发布出去。

let subject1 = PassthroughSubject<Int, Never>() 
let subject2 = PassthroughSubject<String, Never>() 
check("Zip") { 
    subject1.zip(subject2) 
}

subject1.send(1)
subject2.send("A")
subject1.send(2)

// 输出: 
// ----- Zip ----- 
// receive subscription: (Zip) 
// request unlimited 
// receive value: ((1, "A"))

combineLatest (当...或...)

Publisher1 发布值,或者 Publisher2 发布值时,将两个值合并,作为新的事件发布出去。

let subject1 = PassthroughSubject<Int, Never>() 
let subject2 = PassthroughSubject<String, Never>() 
check("CombineLatest") { 
    subject1.combineLatest(subject2) 
}

subject1.send(1)
subject2.send("A")
subject1.send(2)

// 输出: 
// ----- Zip ----- 
// receive subscription: (Zip) 
// request unlimited 
// receive value: ((1, "A"))
// receive value: ((2, "A"))

相关文章

  • Combine -- Subject

    Subject 也是 Combine 框架中的一个协议,它为我们提供了从外界发送数据的方式。 外界每次调用 sen...

  • Combine-Subject

    Subject是一种特殊的 Publisher,最大的特点是可以手动发送数据。定义如下: 从定义可以看到,Subj...

  • 2021-01-29

    Combine之Subjects 在响应式编程的世界中,Subject不太好翻译。在Combine中,存在两个Su...

  • Swift Combine 之 Subject

    Subject 观察者,继承于Publisher,作为一个观察者的身份,可以监听其他源 被观察者,可以发送数据流,...

  • Combine最简流程源码解析

    Combine Combine是Apple出的Functional Reactive Programming (F...

  • 一些 Combine 的实际场景

    摘自《SwiftUI和Combine编程》---《SwiftUI中的Combine》 对于通过 Action 改变...

  • 2021-01-27

    Combine之简述 用Apple的话说,Combine是: a declarative Swift API fo...

  • Leetcode PHP题解--D91 175. Combine

    D91 175. Combine Two Tables 题目链接 175. Combine Two Tables ...

  • RxJava2.0----Subject&Observe

    Subject/Observer Subject/Observer模式,Subject翻译为主题 , Subjec...

  • SwiftUI 与 Combine(简介)

    SwiftUI 与 Combine(简介)什么是SwiftUI?什么是Combine?响应式编程:异步编程:何时可...

网友评论

      本文标题:Combine -- Subject

      本文链接:https://www.haomeiwen.com/subject/csehfltx.html