Combine操作符append和prepend

本文介绍了SwiftUI Combine中`prepend`和`append`操作符的用法。`prepend`用于在Publisher前面添加Output或另一个Publisher,而`append`则在后面添加。通过示例代码展示了如何在实际应用中使用这两个操作符,如拼接网络请求。在处理网络请求的场景中,`prepend`和`append`决定了数据处理的顺序。注意,使用这两个操作符时,添加的Output或Publisher的类型必须与原始Publisher匹配。

swift标准库中有append函数,可以在数组或字符串后添加一个相同类型的数据,比如

var str = "Hello"
str.append(" world!")
// Output
Hello world!

在Combi个ine中,也可以使用append来给Publisher在后面增加一个Output,或者增加一个Publisher,同时,Combine还提供了一个prepend操作符,和append相反,他是在前面增加一个Output,或是publisher

prepend Output

比如我们在playground中实现如下代码

// Combine
var subscriptions = Set<AnyCancellable>()

// prepend 一个Output
func prependOutputExample() {
    let stringPublisher = ["World!"].publisher

    stringPublisher
        .prepend("Hello")
        .sink(receiveValue: { print($0) })
        .store(in: &subscriptions)
}

prependOutputExample()

// Output
Hello
World!

stringPublisher本身的Output是字符串“World!”,经过prepend操作符处理后,他变成了

[ "Hello", "World!"]

所以sink接收时,会接收到两次数据,分别是“Hello”和“World!”。

将上面代码改成append后,会变成在后面添加Hello,就不再用代码举例了。

prepend Publisher

// prepend 一个Publisher
func prependPublisherExample() {
    let subject = PassthroughSubject<String, Never>()
    let stringPublisher = ["Break things!"].publisher

    stringPublisher
        .prepend(subject)
        .sink(receiveValue: { print($0) })
        .store(in: &subscriptions)

    s
Combine框架常用操作符主要分为过滤操作符、转换操作符、收集操作符时间操作符等几类,以下为你详细介绍: ### 过滤操作符 - **filter**:用于筛选出符合特定条件的值。 ```swift let numbers = (1...10).publisher numbers.filter { $0 % 2 == 0 } .sink { print($0) } ``` - **removeDuplicates**:移除连续重复的值。 ```swift let repeatedNumbers = [1, 1, 2, 2, 3, 3].publisher repeatedNumbers.removeDuplicates() .sink { print($0) } ``` - **compactMap**:移除`nil`值,并对非`nil`值进行转换。 ```swift let optionalNumbers: [Int?] = [1, nil, 2, nil, 3] let publisher = optionalNumbers.publisher publisher.compactMap { $0 } .sink { print($0) } ``` - **ignoreOutput**:忽略所有输出值,只传递完成信号。 ```swift let numbers = (1...5).publisher numbers.ignoreOutput() .sink(receiveCompletion: { print($0) }, receiveValue: { _ in }) ``` ### 转换操作符 - **map**:对发布者发出的每个值进行转换。 ```swift let numbers = (1...5).publisher numbers.map { $0 * 2 } .sink { print($0) } ``` - **flatMap**:将一个发布者发出的值转换为其他发布者,并将这些发布者发出的值合并为一个流。 ```swift let publishers = [Just(1), Just(2), Just(3)].publisher publishers.flatMap { $0 } .sink { print($0) } ``` ### 收集操作符 - **collect**:将多个值收集到一个数组中,然后一次性发布。 ```swift let numbers = (1...5).publisher numbers.collect() .sink { print($0) } ``` ### 时间操作符 - **debounce**:在用户输入一段时间后再处理输入的文本,避免频繁操作。 ```swift import Combine import Foundation let subject = PassthroughSubject<String, Never>() subject.debounce(for: .seconds(1), scheduler: RunLoop.main) .sink { print($0) } subject.send("A") subject.send("B") subject.send("C") // 等待1秒后才会处理最后一个值 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值