Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于异步编程的一些概念 #3

Open
LeeSen11 opened this issue Nov 24, 2020 · 0 comments
Open

关于异步编程的一些概念 #3

LeeSen11 opened this issue Nov 24, 2020 · 0 comments

Comments

@LeeSen11
Copy link
Owner

LeeSen11 commented Nov 24, 2020

异步编程的本质是响应未来的事件流。

在异步编程中,一个事件及其对应的数据被发布出来,最后被订阅者消化和使用。期间这些事件和数据需要通过一系列操作变形,成为我们最终需要的事件和数据。

Combine中负责发布事件的是Publisher,负责订阅事件的是Subscriber,负责转换事件和数据的是Operator

image

Publisher的协议声明及其最重要的一个扩展代码:

public protocol Publisher {
    // publisher生成的值的类型
    associatedtype Output
    // publisher课程产生的错误类型,如果是Never的话,表明这个publisher永远不会生成错误
    associatedtype Failure: Error
 
    // 订阅者通过调用publisher的subscribe(_:)方法来将二者绑定在一起
    func receive<S>(subscriber: S) where S: Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
}

extension Publisher {
    // subscribe(_:)的实现会调用receive(_:)以此来将subscriber和publisher进行关联,也就是创建一个订阅关系
    public func subscribe<S>(_ subscriber: S) where S: Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
}

Subscriber协议声明:

public protocol Subscriber: CustomCombineIdentifierConvertible {
    // subscriber接收的值类型
    associatedtype Input
    // subscriber接收的错误类型,如果subscriber不接收任何错误的话,那么使用Never
    associatedtype Failure: Error

    // publisher通过调用subscriber的receive(subscription:)方法来将subscription传递给subscriber
    func receive(subscription: Subscription)

    // publisher调用subscriber的receive(_:)来将它刚刚生成的新值发送给subscriber
    func receive(_ input: Self.Input) -> Subscribers.Demand

    // publisher停止发送数据或者因为错误终止时,会调用subscriber的receive(completion:)告诉subscriber
    func receive(completion: Subscribers.Completion<Self.Failure>)
}

将publisher和subscriber链接在一起的是subscription,下面是Subscription的协议:

public protocol Subscription: Cancellable, CustomCombineIdentifierConvertible {
    // subscriber会调用request(_:)时指定的最大数量或无限制,来表明它是否愿意接受更多的数据
    func request(_ demand: Subscribers.Demand)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant