Swift Combine 使用 sink, assign 创建一个订阅者 从入门到精通九

Combine 系列

  1. Swift Combine 从入门到精通一
  2. Swift Combine 发布者订阅者操作者 从入门到精通二
  3. Swift Combine 管道 从入门到精通三
  4. Swift Combine 发布者publisher的生命周期 从入门到精通四
  5. Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五
  6. Swift Combine 订阅者Subscriber的生命周期 从入门到精通六
  7. Swift 使用 Combine 进行开发 从入门到精通七
  8. Swift 使用 Combine 管道和线程进行开发 从入门到精通八
    在这里插入图片描述

本章包括一系列模式和发布者、订阅者和管道的示例。 这些示例旨在说明如何使用 Combine 框架完成各种任务。

1. 使用 sink 创建一个订阅者

  • 目的: 要接收来自发布者或管道生成的输出以及错误或者完成消息,你可以使用 sink 创建一个订阅者。

Sink 创建了一个通用订阅者来捕获或响应来自 Combine 管道的数据,同时支持取消和 发布者和订阅者的生命周期。

1.1 简单版本的 sink 是非常简洁的,跟了一个尾随闭包来接收从管道发送来的数据。

let cancellablePipeline = publishingSource.sink { someValue in 
    // do what you want with the resulting value passed down
    // be aware that depending on the publisher, this closure
    // may be invoked multiple times.
    print(".sink() received \(someValue)")
})

1.2 带有完成事件和数据的 sink

let cancellablePipeline = publishingSource.sink(receiveCompletion: { completion in 
    switch completion {
    case .finished:
        // no associated data, but you can react to knowing the
        // request has been completed
        break
    case .failure(let anError):
        // do what you want with the error details, presenting,
        // logging, or hiding as appropriate
        print("received the error: ", anError)
        break
    }
}, receiveValue: { someValue in
    // do what you want with the resulting value passed down
    // be aware that depending on the publisher, this closure
    // may be invoked multiple times.
    print(".sink() received \(someValue)")
})

cancellablePipeline.cancel() 
  • Sinks 是通过发布者或管道中的代码链创建的,并为管道提供终点。 当 sink 在发布者创建或调用时,它通过 subscribe 方法隐式地开始了 发布者和订阅者的生命周期,并请求无限制的数据。
  • Sinks 是可取消的订阅者。在任何时候,你可以使用 sink 末端对其的引用,并在上面调用 .cancel() 来使管道失效并关闭管道。

2. 使用 assign 创建一个订阅者

  • 目的: 使用管道的结果来设置值,这个值通常是位于用户界面或控制组件上的属性,不过任何符合 KVO 的对象都可以提供该值。

Assign 是专门设计用于将来自发布者或管道的数据应用到属性的订阅者,每当它收到数据时都会更新该属性。 与 sink 一样,它创建时激活并请求无限数据。 Assign 要求将失败类型指定为 ,因此,如果你的管道可能失败(例如使用 try在这里插入代码片Map 等操作符),则需要在使用 .assign 之前 错误处理。

2.1 简单的 assign 例子

let cancellablePipeline = publishingSource 
    .receive(on: RunLoop.main) 
    .assign(to: \.isEnabled, on: yourButton) 

cancellablePipeline.cancel() 
  1. .assign 通常在创建时链接到发布者,并且返回值是可取消的。
  2. 如果 .assign 被用于更新用户界面的元素,则需要确保在主线程更新它。这个调用确保了订阅者是在主线程上接收数据的。
  3. Assign 持有对使用 key path 更新的属性的引用,以及对正在更新的对象的引用。
  4. 在任何时候,你都可以调用 cancel() 终止和使管道失效。通常,当把从管道中更新的对象(如 viewController)销毁时,我们会取消管道。

参考

https://heckj.github.io/swiftui-notes/index_zh-CN.html

代码

https://github.com/heckj/swiftui-notes

你可能感兴趣的:(iOS,swift,开发语言,ios,combine,sink,assign)