美文网首页SwiftUI
Combine-Subject

Combine-Subject

作者: YungFan | 来源:发表于2020-05-05 15:36 被阅读0次

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

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

    从定义可以看到,Subject 暴露了 3 个 send 方法,调用者可以通过send方法来手动发布Output数据以及Completion事件。

    内置Subject

    PassthroughSubject

    简单地将通过 send 发送数据或事件给下游的 Publisher 或 Subscriber, 并不会对接收到的数据进行保留

    import Combine
    
    // 1 创建PassthroughSubject
    let subject = PassthroughSubject<String, Never>()
    // 2 订阅
    let subscription = subject.sink(receiveCompletion: { _ in
        print("receiveCompletion")
    }, receiveValue: { value in
        print(value)
    })
    // 3 发送数据
    subject.send("Hello")
    subject.send("Combine")
    subject.send(completion: .finished)
    
    /* 输出
     Hello
     Combine
     receiveCompletion
     */
    

    CurrentValueSubject

    保留一个最后的数据,并在被订阅时将这个数据发送给下游的 Publisher 或 Subscriber。

    import Combine
    
    // 1 创建CurrentValueSubject,需要初始化一个数据
    let subject = CurrentValueSubject<String, Never>("Hello")
    // CurrentValueSubject有value属性
    print(subject.value)
    
    // 2 发送数据
    subject.send("Combine")
    print(subject.value)
    
    // 3 订阅
    let subscription = subject.sink { value in
        print(value)
    }
    
    /* 输出
     Hello
     Combine
     Combine
     */
    

    相关文章

      网友评论

        本文标题:Combine-Subject

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